我有两个数据帧,我想逐个添加。也就是说,给定
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>
建议?
答案 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