我有一个2d numpy数组,第一列有重复值。 重复的值可以在第二列中具有任何相应的值。
使用numpy很容易找到cumsum,但是,我必须找到所有重复值的cumsum。
我们如何使用numpy或pandas有效地做到这一点?
在这里,我使用无效的for-loop解决了这个问题。 我想知道是否有更优雅的解决方案。
问题 我们怎样才能以更有效的方式获得相同的结果?
帮助将不胜感激。
#!python
# -*- coding: utf-8 -*-#
#
# Imports
import pandas as pd
import numpy as np
np.random.seed(42) # make results reproducible
aa = np.random.randint(1, 20, size=10).astype(float)
bb = np.arange(10)*0.1
unq = np.unique(aa)
ans = np.zeros(len(unq))
print(aa)
print(bb)
print(unq)
for i, u in enumerate(unq):
for j, a in enumerate(aa):
if a == u:
print(a, u)
ans[i] += bb[j]
print(ans)
"""
# given data
idx col0 col1
0 7. 0.0
1 15. 0.1
2 11. 0.2
3 8. 0.3
4 7. 0.4
5 19. 0.5
6 11. 0.6
7 11. 0.7
8 4. 0.8
9 8. 0.9
# sorted data
4. 0.8
7. 0.0
7. 0.4
8. 0.9
8. 0.3
11. 0.6
11. 0.7
11. 0.2
15. 0.1
19. 0.5
# cumulative sum for repeated serial
4. 0.8
7. 0.0 + 0.4
8. 0.9 + 0.3
11. 0.6 + 0.7 + 0.2
15. 0.1
19. 0.5
# Required answer
4. 0.8
7. 0.4
8. 1.2
11. 1.5
15. 0.1
19. 0.5
"""
答案 0 :(得分:3)
您可以groupby
col0
找到.sum()
的{{1}}。
col1
输出:
df.groupby('col0')['col1'].sum()
答案 1 :(得分:2)
我认为{@ 1}}方法(例如@HarvIpan提供的方法)最适合可读性和功能性,但由于您还要求使用pandas
方法,因此这是一种方法numpy
使用列表推导,它比原始循环更简洁:
numpy
返回:
np.array([[i,np.sum(bb[np.where(aa==i)])] for i in np.unique(aa)])