我在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。对于每个" hit",其中df2中ColumnA中的行与df1中Column1中的行具有相同的值,我想要将一列添加到df1,其中df2的列B对于其中的行"打"找到了,所以我的结果看起来像这样:
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'
哪个"工作"我得到一个输出,但我不认为它迭代行并比较它们,因为它只打印&#la; lalala'两次。所以我研究了一些,并找到了迭代数据帧每一行的方法,即:
for index, row in df1.iterrows():
print row['Column1]
但我不知道如何使用它来比较两个数据帧的列并获得我想要的输出。
任何有关如何做到这一点的帮助都会非常感激。
答案 0 :(得分:4)
我建议您使用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
2)对于每个组我生成数据框 buffer_df :
Column1 Column_0 Column_1 Column_2
0 1 a d e
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
4)最后我为 df1 和 dfs 执行左连接,获得所需的结果。
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