如何合并数据框中的两个Pandas并按数据框中的数字记录排序?

2024-06-26 12:57:46 发布

您现在位置:Python中文网/ 问答频道 /正文

现在,我有两个熊猫数据帧

规则是:
当两个数据帧的“否”相同时,
只需将“pass”结果记录获取到df1数据帧

当两个数据帧的“否”不同时, 根据数字大小将df2的数据帧合并到df1中

数据帧1和2的格式如下:

====df1====
   no result
0  12   pass
1  13   fail
2  15   pass
3  16   pass
4  17   fail

====df2====
   no result
0  13   pass
1  14   fail

预期的答案是:

====df1-merge====
   no result
0  12   pass
1  13   pass
2  14   fail
3  15   pass
4  16   pass
5  17   fail

但在执行代码后,结果如下,如何将代码修复为与上述预期答案相同的结果? 谢谢

====df1-merge====
   no result
0  12   pass
1  13   pass
2  15   pass
3  16   pass
4  17   fail

我的代码如下:

import pandas as pd
import numpy as np

lst11 = [12,13,15,16,17]
lst12 = ["pass","fail","pass","pass","fail"]
df1 = pd.DataFrame(list(zip(lst11,lst12)), columns = ['no','result'])

lst21 = [13,14]
lst22 = ["pass","fail"]
df2 = pd.DataFrame(list(zip(lst21,lst22)), columns = ['no','result'])
print("====df1====")
print(df1)
print("====df2====")
print(df2)


for i in range(len(df1) - 1):
    no1 = df1.at[i, "no"] 

    for x in range(len(df2)):
        no2 = df2.at[x, "no"]
        if no1 == no2:
            result_no1 = df1.at[i,'result'] 
            result_no2 = df2.at[x,'result']  
            #==============================
            if result_no1 == "pass":
                result_no1_str = 1
            else:
                result_no1_str = 0

            if result_no2 == "pass":
                result_no2_str = 1
            else:
                result_no2_str = 0
            #==============================
            result_all = result_no1_str or result_no2_str
            #==============================
            if result_all == 1:
                result_all = "pass"
            else:
                result_all = "fail"
            df1.at[i, "result"] = result_all 

      
        else:
            
            if no1 < no2:  
                if i == len(df1) - 1: 
                    no = df2.at[x,'no'] 
                    result = df2.at[x,'result'] 
                    df1.loc[len(df1.index)] = [no, result]  

                else: 
                    pass

                
            else: 
                if i == len(df1) - 1: 
                    no = df2.at[i,'no'] 
                    result = df2.at[i,'result']               
                    df1.loc[i+1] = pd.Series({"no": no,"Result": result}) 
                else:
                    pass
                

print("\n====df1-merge====")
print(df1)

添加“N/A”结果类型后的新编辑

如果结果类型为“N/A”,而不仅仅是“通过”和“失败”。。。 规则是:

当两个数据帧的“否”相同时, 只需将“pass”结果记录获取到df1数据帧

但如果其中一个结果为“不适用”,则首先选择“通过”,然后选择“失败”, 如果两个结果均为“不适用”,则选择“不适用”

当两个数据帧的“否”不同时, 根据数字大小将df2的数据帧合并到df1中

The both of dataframe 1 and 2 is below:
====df1====
   no result
0  12   pass
1  13   fail
2  15   pass
3  16   N/A
4  17   N/A
5  18   pass

====df2====
   no result
0  13   pass
1  14   fail
2  15   N/A
3  16   N/A
4  17   fail

预期的答案是:

====df1-merge====
   no result
0  12   pass
1  13   pass
2  14   fail
3  15   pass
4  16   N/A
5  17   fail
6  18   pass

Tags: 数据nolenifpassresultelseat
1条回答
网友
1楼 · 发布于 2024-06-26 12:57:46
df = df1.copy()
df.loc[df["no"].isin(df2["no"]), "result"] = "pass"
df = df.append(df2[~df2["no"].isin(df["no"])], ignore_index=True)

注意:这里我重置了结果数据帧的索引,以避免重复索引

EDIT:要使用NA值,将no列设置为数据帧的索引要简单得多(即,通过如下方式创建数据帧:df1 = pd.DataFrame(data=lst12, index=lst11, columns=["result"])

然后,当两个数据帧中的值都不是na时,您可以添加一个额外的条件,仅修改第一个数据帧的结果列

df = df1.copy()
df.loc[df.index.isin(df2.index) & (~(df2["result"].isna() & df["result"].isna())).reindex(df.index), "result"] = "pass"
df = df.append(df2[~df2.index.isin(df.index)]).sort_index()

相关问题 更多 >