假设我们有两个数据框,其列如下:
df1[['name', 'year', 'col1', 'col2', 'col3']]
df2[['name', 'year', 'col2', 'col3', 'col4']]
我想通过name
and合并 df1 和 df2 ,year
条件是保留 的所有值col2
col3
,df1
如果是,None
则使用 中的值df2
我知道如何通过合并然后使用以传统方式来做到df1
这df2
一点ffill()
。
由于我的数据清理过程涉及合并具有相同列的不同 df 的许多步骤,因此当我不得不继续使用ffill()
和drop
列时,代码就不那么干净了。我不知道是否pd.merge
有这样的内置选项?
示例代码:
df1 = pd.DataFrame({'name': ['a', 'a', 'b', 'b', 'c', 'c'],
'year': [2000, 2001, 2002, 2003, 2004, 2005],
'col1': [1,2,3,4,5,6],
'col2': [0,2,4,6,8,None],
'col3': [1,3,5,7,None,9]})
df2 = pd.DataFrame({'name': ['b', 'b', 'c', 'c', 'd', 'd'],
'year': [2003, 2004, 2004, 2005, 2006, 2007],
'col2': [10,20,30,None,50,60],
'col3': [100,300,500,700,None,900],
'col4': [5,6,7,8,9,10]})
输入:
df1
name year col1 col2 col3
0 a 2000 1 0.00 1.00
1 a 2001 2 2.00 3.00
2 b 2002 3 4.00 5.00
3 b 2003 4 6.00 7.00
4 c 2004 5 8.00 NaN
5 c 2005 6 NaN 9.00
df2
name year col2 col3 col4
0 b 2003 10.00 100.00 5
1 b 2004 20.00 300.00 6
2 c 2004 30.00 500.00 7
3 c 2005 NaN 700.00 8
4 d 2006 50.00 NaN 9
5 d 2007 60.00 900.00 10
期望输出
name year col1 col2 col3 col4
0 a 2000 1.00 0.00 1.00 NaN
1 a 2001 2.00 2.00 3.00 NaN
2 b 2002 3.00 4.00 5.00 NaN
3 b 2003 4.00 6.00 7.00 5.00
4 b 2004 NaN 20.00 300.00 6.00
5 c 2004 5.00 8.00 500.00 7.00
6 c 2005 6.00 NaN 9.00 8.00
7 d 2006 NaN 50.00 NaN 9.00
8 d 2007 NaN 60.00 900.00 10.00
假设名称/年份的唯一组合,您可以
concat
:groupby.first
对于更通用的合并,您可以执行两次合并,排除公共的非键列,然后
combine_first
:另一个选项是
merge
:最后是
groupby.first
:输出:
Combine_first 填充值,然后删除以 _df1 或 _df2 结尾的列
输出