我有两个数据框架,需要按列比较这两个数据框架,并将结果附加到旁边.

DF 1:

Claim_number Claim_Status
1001 Closed
1002 In Progress

DF 2:

Claim_number Claim_Status
1001 Closed
1002 Open

预期yields :

DF 3:

Claim_number_DF1 Claim_number_DF2 Comparison_of_Claim_number Claim_status_DF1 Claim_status_DF2 Comparison_of_Claim_Status
1001 1001 TRUE Closed Closed TRUE
1002 1002 TRUE In Progress Open FALSE

下面的代码正在工作,但它会抛出性能警告"Performance Warning:DataFrame高度碎片化. 这通常是多次调用' frame.insert '的结果,性能较差. 请考虑使用pd.concat(轴=1)一次连接所有列. 要获取碎片整理的帧,请使用' newframe = frame.Copy()'

代码:

i = 0
df_mismatch = pd.DataFrame()
while i < len(DF1.columns):
    df_mismatch[f'{col_list[i]}_dev'] = DF1[Df1.columns[i]]
    df_mismatch[f'{col_list[i]}_test'] = Df2[Df2.columns[i]]
    df_mismatch[f'comparison_of_{col_list[i]}'] = np.where(
                 (Df1[Df1.columns[i]] == Df2[Df2.columns[i]]), True, False)
    i = i+1

推荐答案

您可以join个数据框架及其比较:

out = (df1.join(df2, lsuffix='_df1', rsuffix='_df2')
          .join(df1.eq(df2).add_prefix('Comparison_of'))
      )

输出:

   Claim_number_df1 Claim_Status_df1  Claim_number_df2 Claim_Status_df2  Comparison_ofClaim_number  Comparison_ofClaim_Status
0              1001           Closed              1001           Closed                       True                       True
1              1002      In Progress              1002             Open                       True                      False

您还可以通过concat来获得MultiIndex(您可以进一步处理).

out = pd.concat({'df1': df1, 'df2': df2, 'comparison': df1.eq(df2)}, axis=1)

输出:

           df1                       df2                comparison             
  Claim_number Claim_Status Claim_number Claim_Status Claim_number Claim_Status
0         1001       Closed         1001       Closed         True         True
1         1002  In Progress         1002         Open         True        False

post-processing the MultiIndex to have a desired order:

out = (pd.concat({'df1': df1, 'df2': df2, 'comparison': df1.eq(df2)}, axis=1)
         .swaplevel(axis=1)[df1.columns]
      )

out.columns = out.columns.map(lambda x: f'{x[1]}_{x[0]}')

输出:

   df1_Claim_number  df2_Claim_number  comparison_Claim_number df1_Claim_Status df2_Claim_Status  comparison_Claim_Status
0              1001              1001                     True           Closed           Closed                     True
1              1002              1002                     True      In Progress             Open                    False

如果您想添加df1/df2作为后缀并添加comparison作为后缀,则可以 Select 变体:

out = (pd.concat({'df1': df1, 'df2': df2, 'comparison': df1.eq(df2)}, axis=1)
         .swaplevel(axis=1)[df1.columns]
      )

out.columns = out.columns.map(lambda x: f'{x[1]}_{x[0]}' if x[1] == 'comparison' else f'{x[0]}_{x[1]}')

输出:

   Claim_number_df1  Claim_number_df2  comparison_Claim_number Claim_Status_df1 Claim_Status_df2  comparison_Claim_Status
0              1001              1001                     True           Closed           Closed                     True
1              1002              1002                     True      In Progress             Open                    False

Python相关问答推荐

Pandas 填充条件是另一列

使用SciPy进行曲线匹配未能给出正确的匹配

可变参数数量的重载类型(args或kwargs)

通过Selenium从页面获取所有H2元素

按列分区,按另一列排序

Python库:可选地支持numpy类型,而不依赖于numpy

用合并列替换现有列并重命名

加速Python循环

如何使用Pandas DataFrame按日期和项目汇总计数作为列标题

在两极中过滤

Django admin Csrf令牌未设置

寻找Regex模式返回与我当前函数类似的结果

OpenGL仅渲染第二个三角形,第一个三角形不可见

如何从pandas DataFrame中获取. groupby()和. agg()之后的子列?

Python pint将1/华氏度转换为1/摄氏度°°

什么是一种快速而优雅的方式来转换一个包含一串重复的列,而不对同一个值多次运行转换,

提取数组每行的非零元素

解决Geopandas和Altair中的正图和投影问题

操作布尔值的Series时出现索引问题

如何从一个维基页面中抓取和存储多个表格?