Python 如果列和它';两个数据帧中是否都存在s值?

Python 如果列和它';两个数据帧中是否都存在s值?,python,pandas,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')

如果列在两个数据帧中都有值,如何合并两个数据帧

数据帧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'
但这并不能产生所需的输出

这里有一个完整的最小示例:

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'
我想要这个:

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'
但请记住:

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'
IIUC,你能做到

在其他数据库中的相同位置更新值为空的元素



如果实际案例数据的
NaN
不在同一位置,则
combine\u first
可能会失败,在这种情况下,您可以使用
pd.merge
Series.fillna

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)


如果您需要使用,我会这样尝试:



其他答案要好得多,但最终您需要使用内部连接(默认为合并),并且可以使用
ffill
C列,这将非常简单,如
df3.C=df3.C.ffill()

非常感谢您提供了快速而完美的答案!