逐行比较两个长度不同的数据框,并为每行添加具有相等值的列

5
我可以帮助您进行翻译。以下是需要翻译的内容:

我在Python Pandas中有两个不同长度的数据框,就像这样:

df1:                                 df2:

      Column1  Column2 Column3            ColumnA ColumnB 
    0    1       a       r              0    1       a
    1    2       b       u              1    1       d
    2    3       c       k              2    1       e
    3    4       d       j              3    2       r
    4    5       e       f              4    2       w
                                        5    3       y 
                                        6    3       h

我现在想要做的是比较df1的Column1和df2的ColumnA。对于每个“命中”,即df2中的一行在ColumnA中具有与df1中的一行在Column1中相同的值,我希望将df2中“命中”所在的行的ColumnB的值附加到df1中,使得我的结果如下:
df1:

   Column1  Column2  Column3  Column4 Column5  Column6
0     1        a        r        a       d        e
1     2        b        u        r       w
2     3        c        k        y       h
3     4        d        j
4     5        e        f

到目前为止我尝试过的是:

for row in df1, df2:
   if df1[Column1] == df2[ColumnA]:
      print 'yey!'

我遇到了一个错误,提示我不能比较两个长度不同的数据框。所以我尝试了以下方法:

for row in df1, df2:
    if def2[def2['ColumnA'].isin(def1['column1'])]:
        print 'lalala' 
    else:
        print 'Nope'

我写的代码可以输出结果,但我认为它没有迭代每一行并进行比较,因为它只打印了两次“lalala”。所以我继续研究并找到了一种迭代每个数据框行的方法,如下:

for index, row in df1.iterrows():
    print row['Column1]

但是我不知道如何使用它来比较两个数据框的列并获得我想要的输出。

如果有帮助我解决这个问题的方法,将不胜感激。

1个回答

5

我建议您使用DataFrame API,它允许您以 join, merge, groupby 等方式操作DF。您可以在下面找到我的解决方案:

import pandas as pd

df1 = pd.DataFrame({'Column1': [1,2,3,4,5], 
    'Column2': ['a','b','c','d','e'], 
    'Column3': ['r','u','k','j','f']})

df2 = pd.DataFrame({'Column1': [1,1,1,2,2,3,3], 'ColumnB': ['a','d','e','r','w','y','h']})

dfs = pd.DataFrame({})
for name, group in df2.groupby('Column1'):
    buffer_df = pd.DataFrame({'Column1': group['Column1'][:1]})
    i = 0
    for index, value in group['ColumnB'].iteritems():
        i += 1
        string = 'Column_' + str(i)
        buffer_df[string] = value

    dfs = dfs.append(buffer_df)

result = pd.merge(df1, dfs, how='left', on='Column1')
print(result)

结果是:
   Column1 Column2 Column3 Column_0 Column_1 Column_2
0        1       a       r        a        d        e
1        2       b       u        r        w      NaN
2        3       c       k        y        h      NaN
3        4       d       j      NaN      NaN      NaN
4        5       e       f      NaN      NaN      NaN

P.s. 更多细节:

1) 对于df2,我通过'Column1'生成。单个是一个数据框。以下是示例:

   Column1 ColumnB
0        1       a
1        1       d
2        1       e

对于每个组,我会生成一个数据框 buffer_df

   Column1 Column_0 Column_1 Column_2
0        1        a        d        e

然后我创建了名为dfs的DF:

   Column1 Column_0 Column_1 Column_2
0        1        a        d        e
3        2        r        w      NaN
5        3        y        h      NaN

4) 最终,我执行左连接 df1dfs,得到所需的结果。

2)* buffer_df 是迭代产生的:

step0 (buffer_df = pd.DataFrame({'Column1': group['Column1'][:1]})):
            Column1
         5       3

step1 (buffer_df['Column_0'] = group['ColumnB'][5]):      
            Column1 Column_0
         5       3       y

step2 (buffer_df['Column_1'] = group['ColumnB'][5]):      
            Column1 Column_0 Column_1
         5       3       y       h

非常感谢,你的回答非常清晰!但是我注意到从buffer_df = ....直到dfs = dfs.append(buffer_df)这段代码,我不太明白你在做什么。您能否解释一下这段代码是做什么的呢?谢谢! - sequence_hard
其实我认为我知道单行代码的作用,但我不知道它们如何一起工作来创建输出... - sequence_hard
是的,现在很清楚了,非常感谢您提供如此详细的答案。昨天我有点晕头转向,所以回复晚了。但是,当我尝试使用脚本处理我的实际数据(这些数据的结构类似于示例数据,只是每个数据框中有更多的列和混合的字符串/整数值),我遇到了以下错误:line 33, in <module> buffer_df[string] = group['Gene'][iter] KeyError: 83 您认为这可能是什么原因引起的? - sequence_hard
@sequence_hard 我已经修复了代码,现在更加健壮。试一下吧,如果有什么问题请告诉我。另外,如果它能正常工作,请给我一个赞。 - ilyakhov
现在它完美地工作了,非常感谢!我看到你是如何使用iteritems()的。我已经为你的答案点赞了(如果有更多的方法可以发送积极反馈,请告诉我:-))再次感谢你的时间和帮助! - sequence_hard
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接