如果两个数据框中都存在列及其值,如何合并两个数据框?

时间:2019-05-13 17:46:17

标签: python pandas

如果一列在两个数据框中都具有值,如何合并两个数据框?

数据帧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'

3 个答案:

答案 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.mergeSeries.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