使用 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
合并 A
和 C
列
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
我有一个数据框
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
合并 A
和 C
列
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