Python 如果列和它';两个数据帧中是否都存在s值?
如果列在两个数据帧中都有值,如何合并两个数据帧 数据帧1–df1Python 如果列和它';两个数据帧中是否都存在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')
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()
非常感谢您提供了快速而完美的答案!