【问题标题】:how to iterate each row of one dataframe and compare with rows in another dataframe in Python?如何迭代一个数据帧的每一行并与Python中另一个数据帧中的行进行比较?
【发布时间】:2019-10-21 20:36:20
【问题描述】:

我有两个数据框:

DF1:

ID     v1           v2         v3
289  1455.0        2.0        0.62239  
289  1460.0        0.0        0.46037  
289  1465.0        4.0        0.41280 
290  1470.0        0.0        0.39540 
290  1475.0        2.0        0.61809 
290  1475.0        2.0        0.61809

DF2:

ID     v1           v2         v3
289  1423.0        2.0        0.62239  
289  142Q.0        0.0        0.46037  
289  14FW.0        4.0        0.41280  
290  14Q3.0        0.0        0.39540  
290  1453.0        2.0        0.61809 
290  1454.0        2.0        0.61809

我想用 DF2 中的每一行迭代 DF1 中的每一行,看看它是否在 DF2 中,类似于:

for row in results_01.iterrows():
    diff = []
    if row not in results_02:
        add different one to 'diff'
        print(diff)

我知道逻辑,但不知道如何做到这一点,Python 新手,谁能帮助我?非常感谢。

【问题讨论】:

  • 给定输入的输出应该是什么?给定样本中没有完全匹配的行
  • 我在下面回答了,但好奇你为什么将相似的行称为“差异”?
  • @LiorCohen 我的错,我想说如果'row not in results_02',然后添加到差异,基本上我想找到不同的行而不是逐行。
  • 回答第一个问题,这个样本数据只是一个例子,我复制到别的地方了。 @G.Anderson
  • 您可能希望包含一些匹配的行,否则您提供的所有行都会不同,因此最简单的代码就是diff=df1.copy()

标签: python pandas loops dataframe comparison


【解决方案1】:

您可以使用“内部”合并轻松完成。

intersect = pd.merge(df1, df2, how='inner')

编辑:

事实证明,需要 df1 而不是 df2 的行而不是交集。 在这种情况下,应该使用isin pandas 方法。 这是处理它的 SO link

【讨论】:

  • 我收到错误'SyntaxError: invalid character in identifier'
【解决方案2】:

您拥有的代码块看起来与您在 python 中所做的非常接近。从一个数据帧中取出一行并遍历另一个数据帧以查找匹配项。

for index, row in results_01.iterrows():
    diff = []
    compare_item = row['col_name'] 
    for index, row in results_02.iterrows():
       if compare_item == row['compare_col_name']:
           diff.append(compare_item, row['col_name']
    return diff 

在这里,我从一个数据帧的一行中获取一个特定的列值,并将其与另一个数据帧的另一个值进行比较

【讨论】:

  • 您好我想比较整行而不是一个元素,因为我只关心具有相同 ID 的行中的差异 :)
  • 它给了我错误'IndentationError: unexpected indent'
  • 这应该修复缩进。希望对您有所帮助!
【解决方案3】:

一种方法(可能不是最有效的)是将数据帧附加在一起,然后删除重复项,如下所示:

full_df = df1.append(df2)
full_df = full_df.drop_duplicates(keep=False)

【讨论】:

  • 为什么 full_df 什么都不返回?我尝试了“results_01.equals(results_03)”,它给出了 False,这意味着两个文件不同
  • 嗨,我尝试了两个不同的文件,它给了我 4 行,我手动比较但发现它们是相同的(成对成对),你知道发生了什么吗?
  • 我不明白你的意思...你不想这样吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-25
  • 2016-08-26
  • 1970-01-01
  • 2018-03-30
  • 1970-01-01
相关资源
最近更新 更多