合并或组合pandas数据帧,同时汇总公共列中的元素

时间:2017-01-13 20:30:11

标签: python pandas

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

我们如何在对行级别中的公共列求和时合并或连接。

2 个答案:

答案 0 :(得分:3)

您可以将yearmonth列设置为索引,然后使用add为您指定行和列索引,将fill_value指定为0,以便如果其中一个数据框中缺少索引,它将使用另一个数据框中的值,而不是使用NaN填充单元格:

(df1.set_index(["year", "month"])
    .add(df2.set_index(["year", "month"]), fill_value = 0)
    .reset_index())

enter image description here

答案 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