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

Conditionally concat a dataframe in python using pandas

我有一个数据框

df

    A  B
0  test1  1
1  test2  4
2  test3  1
3  test4  2

df1

   C
0  test3
1  test5

我想有条件地将它们合并到一个新的数据框

df2

   A   B
0  test1   1
1  test2   4
2  test3   0
3  test4   2
4  test5   0

一个新的数据框,如果 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)

您可以 outer 合并 AC

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 来连接。最后,如果 col A 中有几个相同的值,则在 groupby 中使用一个小 hack,到 select 中 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