如果一列在两个数据框中都具有值,如何合并两个数据框?
数据帧1 – df1
A B C
0 'name1' 'foo' 'bar'
1 'name2' 'foo'' 'bar'
2 'name3' 'foo' NaN
3 'name4' 'foo' NaN
数据框2 – df2
A C
0 'name3' 'bar'
1 'name4' 'bar'
我尝试过:
pd.merge(df1, df2, how='left', on='A')
但这不会创建所需的输出。
以下是完整的最低示例:
import pandas as pd
from io import StringIO
csv1 = """A,B,C
'name1','foo','bar'
'name2','foo'','bar'
'name3','foo',
'name4','foo',
"""
csv2 = """A,C
'name3','bar'
'name4','bar'
"""
df1 = pd.read_csv(StringIO(csv1), header=0)
df2 = pd.read_csv(StringIO(csv2), header=0)
pd.merge(df1, df2, how='left', on='A')
我想要这个:
A B C
0 'name1' 'foo' 'bar'
1 'name2' 'foo'' 'bar'
2 'name3' 'foo' 'bar'
3 'name4' 'foo' 'bar'
但是请获取:
A B C_x C_y
0 'name1' 'foo' 'bar' NaN
1 'name2' 'foo'' 'bar' NaN
2 'name3' 'foo' NaN 'bar'
3 'name4' 'foo' NaN 'bar'
答案 0 :(得分:5)
IIUC,您可以执行df.combine_first()
,
用其他位置相同的值更新空元素。
std::string
df1.set_index('A').combine_first(df2.set_index('A')).reset_index()
答案 1 :(得分:2)
如果实际案例数据在同一位置上没有NaN
,则combine_first
可能会失败,在这种情况下,您可以使用pd.merge
和Series.fillna
:< / p>
df = pd.merge(df1, df2, how='left', on='A', suffixes=['', '_2'])
df['C'].fillna(df['C_2'], inplace=True)
df.drop('C_2', axis=1, inplace=True)
A B C
0 'name1' 'foo' 'bar'
1 'name2' 'foo' 'bar'
2 'name3' 'foo' 'bar'
3 'name4' 'foo' 'bar'
答案 2 :(得分:0)
如果您需要使用merge
,我会这样尝试:
A4200
df3= pd.merge(df, df2, how='left', on=['A','C'])
print(df3)
其他答案要好得多,但是一定要使用内部联接(默认为合并),并且可以 A B C
0 'name1' 'foo' 'bar'
1 'name2' 'foo'' 'bar'
2 'name3' 'foo' NaN
3 'name4' 'foo' NaN
A C
0 'name3' 'bar'
1 'name4' 'bar'
A B C
0 'name1' 'foo' 'bar'
1 'name2' 'foo'' 'bar'
2 'name3' 'foo' NaN
3 'name4' 'foo' NaN
的C列,这很简单,ffill