我有两个数据框
df1 = pd.DataFrame({'col1': ['a', 'b', 'c', 'd', 'e', 'a', 'b'], 'col2': ['p', 'q', 'r', 's', 't', 'q', 't']})
df1
[Output]:
col1 col2
0 a p
1 b q
2 c r
3 d s
4 e t
5 a q
6 b t
df2 = pd.DataFrame({'col1': ['a', 'b', 'c', 'e', 'b'], 'col2': ['p', 'q', 'r', 't', 't'], 'col3': ['val0', 'val1', 'val2', 'val3', 'val4']})
df2
[Output]:
col1 col2 col3
0 a p val0
1 b q val1
2 c r val2
3 e t val3
4 b t val4
两个数据帧中的 col1
和 col2
是相同的。两个数据帧之间的唯一区别是 df2 与 df1 相比缺少一些行。
我需要另一个数据框 df3
,它相当于合并的 df1
和 df2
,将包含来自 df1
的所有行,将具有另一列 {{1 }} 并且还会保留来自 col3
的索引。
例如:
df1
我无法使用 df3
[Output]:
col1 col2 col3
0 a p val0
1 b q val1
2 c r val2
3 d s Nan
4 e t val3
5 a q Nan
6 b t val4
、merge
或 join
完成这项工作。我确信这是非常简单的事情,但我无法理解逻辑。
请注意,col3 的值取决于 col1 和 col2 的组合
答案 0 :(得分:1)
您可以使用 df1
作为基础和左合并(使用 how='left'
)与 df2
合并 col1
和 { {1}},如下:
col2
使用 df3 = df1.merge(df2, on=['col1', 'col2'], how='left')
,Pandas 只使用左框架的键,类似于 SQL 左外连接;保留密钥顺序。因此,how='left'
的行索引将被保留。
结果:
df1