Gaol将合并两个数据帧,同时对公共列中的行进行求和。
数据框1:df1
df1 = pd.DataFrame({'year': ['2001', '2001', '2001', '2002', '2002'], 'month':['01','02','03', '01','02'], 'hits':[2, 3, 5, 12, 5], 'outs': [2, 0, 2, 1, 0] })
数据框2:df2
df2 = pd.DataFrame({'year': ['2001', '2001', '2001', '2002', '2002', '2003', '2003'], 'month':['01','02','03', '01','02', '01','02'], 'hits':[2, 3, 5, 12, 5, 0, 0], 'outs': [2, 0, 2, 1, 0, 1, 4] })
保持列的顺序:
important = ['year', 'month']
reordered = important + [c for c in df1.columns if c not in important]
df1 = df1[reordered]
reordered = important + [c for c in df2.columns if c not in important]
df2 = df2[reordered]
DF1
year month hits outs
0 2001 01 2 2
1 2001 02 3 0
2 2001 03 5 2
3 2002 01 12 1
4 2002 02 5 0
(Pdb) df2
year month hits outs
0 2001 01 2 2
1 2001 02 3 0
2 2001 03 5 2
3 2002 01 12 1
4 2002 02 5 0
5 2003 01 0 1
6 2003 02 0 4
我想要实现的目标如下:
year month hits outs
0 2001 01 4 4
1 2001 02 6 0
2 2001 03 10 4
3 2002 01 24 2
4 2002 02 10 0
5 2003 01 0 1
6 2003 02 0 4
请注意,会添加常用列值。
我尝试了以下操作:使用concat
函数和merge
函数
(Pdb) concat = pd.concat([df1, df2], axis=1)
(Pdb) concat
hits hits outs
year month
2001 01 2.0 2 2
02 3.0 3 0
03 5.0 5 2
2002 01 12.0 12 1
02 5.0 5 0
2003 01 NaN 0 1
02 NaN 0 4
(Pdb) concat.reset_index(inplace=True)
(Pdb) concat
year month hits hits outs
0 2001 01 2.0 2 2
1 2001 02 3.0 3 0
2 2001 03 5.0 5 2
3 2002 01 12.0 12 1
4 2002 02 5.0 5 0
5 2003 01 NaN 0 1
6 2003 02 NaN 0 4
(Pdb) combined = pd.merge(df1,df2, left_index=True, right_index=True)
(Pdb) combined.reset_index(inplace=True)
(Pdb) combined
year month hits_x hits_y outs
0 2001 01 2 2 2
1 2001 02 3 3 0
2 2001 03 5 5 2
3 2002 01 12 12 1
4 2002 02 5 5 0
我们如何在对行级别中的公共列求和时合并或连接。
答案 0 :(得分:3)
您可以将year
和month
列设置为索引,然后使用add
为您指定行和列索引,将fill_value
指定为0,以便如果其中一个数据框中缺少索引,它将使用另一个数据框中的值,而不是使用NaN
填充单元格:
(df1.set_index(["year", "month"])
.add(df2.set_index(["year", "month"]), fill_value = 0)
.reset_index())
答案 1 :(得分:2)
合并pd.concat
+ groupby
这是一种可以容纳列表中任意数量的数据帧的通用方法
pd.concat(
[df1, df2], ignore_index=True
).groupby(['year', 'month'], as_index=False).sum()
year month hits outs
0 2001 01 4 4
1 2001 02 6 0
2 2001 03 10 4
3 2002 01 24 2
4 2002 02 10 0
5 2003 01 0 1
6 2003 02 0 4