使用pandas在python中有条件地连接数据帧
我有一个数据框 df df1 我想有条件地将它们合并到一个新的数据帧中 df2 一个新的数据框,其中如果A列中的值等于C列,则合并时只需将其B列值更新为默认值0,如果A列中没有一个值等于C列中的值,则只需将其添加到数据框中,如上图所示,默认值为0使用pandas在python中有条件地连接数据帧,python,pandas,concat,Python,Pandas,Concat,我有一个数据框 df df1 我想有条件地将它们合并到一个新的数据帧中 df2 一个新的数据框,其中如果A列中的值等于C列,则合并时只需将其B列值更新为默认值0,如果A列中没有一个值等于C列中的值,则只需将其添加到数据框中,如上图所示,默认值为0 df2 = pd.merge(df,df1,left_on='A',right_on='C',how="outer") df2['A'].fillna(value=df2['C'],inplace=True) df2.loc[df2['A'] == d
df2 = pd.merge(df,df1,left_on='A',right_on='C',how="outer")
df2['A'].fillna(value=df2['C'],inplace=True)
df2.loc[df2['A'] == df2['C'],'B'] = 0
df2 = df2[['A','B']]
我更喜欢下面的选项,但它并不是你想要的
df1['B'] = 0
df1.columns = ['A','B']
df2 = pd.concat([df,df1])
df2.drop_duplicates('A',take_last=True,inplace=True)
df2 = df2.sort('A').reset_index(drop=True)
您可以在
A
和C
列上进行outer
合并
In [31]: tmp = df.merge(df1, left_on='A', right_on='C', how='outer')
将列A
nan值从列C
In [32]: tmp['A'].fillna(value=tmp['C'], inplace=True)
然后替换B
值,其中C
值不为空
In [33]: tmp.ix[tmp['C'].notnull(), 'B'] = 0
In [34]: tmp[['A', 'B']]
Out[34]:
A B
0 test1 1
1 test2 4
2 test3 0
3 test4 2
4 test5 0
这里有一个简单的方法。您仅从
col C
中的第二个数据帧中获取元素,该元素不在第一个数据帧的col A
中,并通过将缺少的值设置为0
进行连接。最后,如果列a
中有多个相同的值,您可以在groupby
中使用一个小技巧来选择0
的值:
pd.concat([df,df1.rename(columns={'C':'A'})]).fillna(0).groupby('A', as_index=False).last()
A B
0 test1 1
1 test2 4
2 test3 0
3 test4 2
4 test5 0
希望下面的帮助@上校:谢谢!!我以为这可以用来完成,但事实证明只支持左连接(不支持外部连接)。
In [32]: tmp['A'].fillna(value=tmp['C'], inplace=True)
In [33]: tmp.ix[tmp['C'].notnull(), 'B'] = 0
In [34]: tmp[['A', 'B']]
Out[34]:
A B
0 test1 1
1 test2 4
2 test3 0
3 test4 2
4 test5 0
pd.concat([df,df1.rename(columns={'C':'A'})]).fillna(0).groupby('A', as_index=False).last()
A B
0 test1 1
1 test2 4
2 test3 0
3 test4 2
4 test5 0