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

seq*_*ard 5 python compare dataframe pandas

我在 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
Run Code Online (Sandbox Code Playgroud)

我现在要做的是比较 df1 的 Column1 和 df2 的 ColumnA。对于每个“命中”,其中 df2 中 ColumnA 中的一行与 df1 中 Column1 中的一行具有相同的值,我想将一列附加到 df1,其中 df2 的 ColumnB 为找到“命中”的行,所以我的结果是这样的:

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
Run Code Online (Sandbox Code Playgroud)

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

for row in df1, df2:
   if df1[Column1] == df2[ColumnA]:
      print 'yey!'
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误,说我无法比较两个不同长度的数据帧。所以我试过:

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

就我得到输出而言,哪个“有效”,但我认为它不会遍历行并比较它们,因为它只打印两次“lalala”。因此,我进行了更多研究,并找到了一种迭代数据帧每一行的方法,即:

for index, row in df1.iterrows():
    print row['Column1]
Run Code Online (Sandbox Code Playgroud)

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

任何有关如何做到这一点的帮助将不胜感激。

Gre*_*egg 5

我建议您使用 DataFrame API,它允许在joinmergegroupby等方面与 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)
Run Code Online (Sandbox Code Playgroud)

结果是:

   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
Run Code Online (Sandbox Code Playgroud)

Ps 更多详情:

1) 对于 df2,我按“Column1”生成。单个是一个数据框。下面的例子:

   Column1 ColumnB
0        1       a
1        1       d
2        1       e
Run Code Online (Sandbox Code Playgroud)

2)对于每个我产生数据帧buffer_df

   Column1 Column_0 Column_1 Column_2
0        1        a        d        e
Run Code Online (Sandbox Code Playgroud)

3)之后我创建了 DF dfs

   Column1 Column_0 Column_1 Column_2
0        1        a        d        e
3        2        r        w      NaN
5        3        y        h      NaN
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)