【问题标题】:How can I compare each row from a dataframe against every row from another dataframe and see the difference between values?如何将数据帧中的每一行与另一个数据帧中的每一行进行比较,并查看值之间的差异?
【发布时间】:2021-04-22 13:10:58
【问题描述】:

我有两个数据框:

df1

     Code     Number
0   ABC123      1
1   DEF456      2
2   GHI789      3
3   DEA456      4

df2

     Code 
0   ABD123
1   DEA458
2   GHI789

df1 就像一本字典,我可以通过检查它们的代码从中获取每个项目的相应编号。但是,有未注册的代码,如果我找到未注册的代码,我应该寻找看起来最像它们的代码。所以,结果应该是:

ABD123 = 1(因为它与 ABC123 有 1 个不同的字符)

DEA456 = 4(因为它有1个与DEA456不同的字符,2个来自DEF456,所以它选择最接近的一个)

GHI789 = 3(因为它在 df1 有一个等价物)

我知道如何分别检查每个代码的差异并保存不同字符的“长度”,但我不知道如何应用此代码,因为我不知道如何比较 df2 中的每一行针对 df1 中的所有行。有什么办法吗?

【问题讨论】:

  • this question 的可能重复项。
  • 不幸的是,我无法为 Python 获得新的包或库,因此 sklearn 解决方案不适合我……曾经和我一起工作的一个人设法创建了一个完全可以执行的逻辑我需要什么,但我不能完全理解他做了什么,因此我不能在其他地方应用它

标签: python pandas dataframe


【解决方案1】:

不知道如何将 df2 中的每一行与 df1 中的所有行进行比较。

嵌套循环将起作用。如果你有一个名为compare 的函数,它看起来像这样......

for index2, row2 in df2.iterrows():
    for index1, row1 in df1.iterrows():
        difference = compare(row2,row1)
        #do something with the difference.

在使用 Pandas 或 Numpy 时,嵌套循环通常并不理想,但它们确实有效。可能会有更好的解决方案。


DataFrame.iterrows()

【讨论】:

    【解决方案2】:

    这应该也可以:

    df['Code_e'] = df['Code'].str.extract(r'(\d+)').astype(int)
    df2['Code_e'] = df2['Code'].str.extract(r'(\d+)').astype(int)
    final_df = pd.merge_asof(df2,df.sort_values(by='Code_e'),on='Code_e',suffixes=('','_right')).drop(['Code_e','Code_right'],axis=1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-26
      • 2018-11-19
      • 1970-01-01
      • 2017-04-25
      • 2013-11-18
      • 1970-01-01
      相关资源
      最近更新 更多