使用pandas在python中有条件地连接数据帧

使用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

我有一个数据框

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'] == 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