计算熊猫数据帧的总和

时间:2015-01-02 16:04:51

标签: python python-3.x pandas

我有两个数据帧,我想逐个添加。也就是说,给定

dfc1 = pd.DataFrame(list(zip(range(10),np.zeros(10))), columns=['bin', 'count'])
dfc2 = pd.DataFrame(list(zip(range(0,10,2), np.ones(5))), columns=['bin', 'count'])

给了我这个

dfc1:

       bin  count
0        0      0
1        1      0
2        2      0
3        3      0
4        4      0
5        5      0
6        6      0
7        7      0
8        8      0
9        9      0

dfc2:

       bin  count
0        0      1
1        2      1
2        4      1
3        6      1
4        8      1

我想生成这个:

       bin  count
0        0      1
1        1      0
2        2      1
3        3      0
4        4      1
5        5      0
6        6      1
7        7      0
8        8      1
9        9      0

我添加了bin列匹配的count列。

事实上,事实证明我只添加1(即dfc2中的计数始终为1)。所以问题的另一个版本是“给定一个bin值数组(dfc2.bin),如何在dfc1中为每个相应的计数值添加一个?”

到目前为止,我唯一的解决方案感觉非常低效(并且最终稍微不可读),在两个bin列之间进行外部连接,从而创建第三个数据帧,我在其上进行计算,然后突出显示不需要的列。 / p>

建议?

3 个答案:

答案 0 :(得分:1)

首先将bin设置为两个数据帧中的索引,然后您可以使用add,如果数据帧中缺少bin,则需要使用fillvalue指示零:

dfc1 = dfc1.set_index('bin')
dfc2 = dfc2.set_index('bin')
result = pd.DataFrame.add(dfc1, dfc2, fill_value=0)

Pandas自动汇总具有相同索引的行。

顺便说一下,如果你需要经常执行这样的操作,我强烈建议使用numpy.bincount,这样甚至可以在一个数据帧中重复bin索引

答案 1 :(得分:0)

由于dfc1索引与“bin”值相同,您只需执行以下操作:

dfc1.iloc[dfc2.bin].cnt += 1

请注意,我将“count”列重命名为“cnt”,因为count是一个内置的pandas,这可能会导致混淆和错误!

答案 2 :(得分:0)

作为@ Alleo答案的替代方案,您可以使用方法combineAdd简单地将2个数据框同时添加到set_index,前提是它们的索引将与 bin <匹配/强>:

dfc1.set_index('bin').combineAdd(dfc2.set_index('bin')).reset_index()

   bin  count
0    0      1
1    1      0
2    2      1
3    3      0
4    4      1
5    5      0
6    6      1
7    7      0
8    8      1
9    9      0