Python:查找重复索引累积和的有效方法(numpy方法)

时间:2018-06-07 17:25:14

标签: python pandas numpy data-manipulation numpy-ndarray

我有一个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
"""

2 个答案:

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