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

Python:寻找重复索引累积和的有效方法(numpy方法),python,pandas,numpy,data-manipulation,numpy-ndarray,Python,Pandas,Numpy,Data Manipulation,Numpy Ndarray,我有一个2d numpy数组,在第一列中有重复的值。 重复的值可以在第二列中有任何对应的值 使用numpy很容易找到总和,但是,我必须找到所有重复值的总和 我们如何才能有效地使用numpy或pandas 在这里,我使用无效for循环解决了这个问题。 我想知道是否有更优雅的解决方案 问题 我们如何才能以更有效的方式获得相同的结果 我们将不胜感激 #!python # -*- coding: utf-8 -*-# # # Imports import pandas as pd import nump

我有一个2d numpy数组,在第一列中有重复的值。 重复的值可以在第二列中有任何对应的值

使用numpy很容易找到总和,但是,我必须找到所有重复值的总和

我们如何才能有效地使用numpy或pandas

在这里,我使用无效for循环解决了这个问题。 我想知道是否有更优雅的解决方案

问题 我们如何才能以更有效的方式获得相同的结果

我们将不胜感激

#!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
"""

您可以
groupby
col0
并找到
col1
.sum()

df.groupby('col0')['col1'].sum()
输出:

col0
4.0     0.8
7.0     0.4
8.0     1.2
11.0    1.5
15.0    0.1
19.0    0.5
Name: col1, dtype: float64

您可以
groupby
col0
并找到
col1
.sum()

df.groupby('col0')['col1'].sum()
输出:

col0
4.0     0.8
7.0     0.4
8.0     1.2
11.0    1.5
15.0    0.1
19.0    0.5
Name: col1, dtype: float64

我认为@HarvIpan提供的
pandas
方法对于可读性和功能性来说是最好的,但是既然您也要求使用
numpy
方法,下面是一种在
numpy
中使用列表理解的方法,它比您原来的循环更简洁:

np.array([[i,np.sum(bb[np.where(aa==i)])] for i in np.unique(aa)])
返回:

array([[  4. ,   0.8],
       [  7. ,   0.4],
       [  8. ,   1.2],
       [ 11. ,   1.5],
       [ 15. ,   0.1],
       [ 19. ,   0.5]])

我认为@HarvIpan提供的
pandas
方法对于可读性和功能性来说是最好的,但是既然您也要求使用
numpy
方法,下面是一种在
numpy
中使用列表理解的方法,它比您原来的循环更简洁:

np.array([[i,np.sum(bb[np.where(aa==i)])] for i in np.unique(aa)])
返回:

array([[  4. ,   0.8],
       [  7. ,   0.4],
       [  8. ,   1.2],
       [ 11. ,   1.5],
       [ 15. ,   0.1],
       [ 19. ,   0.5]])

我想你正在寻找一个
groupby()
…如果
aa
是整数,并且从一个不太大的间隔开始,你可以使用
np.bincount(aa,bb,aa.max()+1)
我没有对它进行基准测试,但我认为它通常比pandas扩展得更好。我想你正在寻找一个
groupby()
…如果
aa
是整数,并且从一个不太大的间隔开始,你可以使用
np.bincount(aa,bb,aa.max()+1)
我没有对它进行基准测试,但我希望它比pandas更具代表性。非常感谢,我们能在numpy中也这样做吗?@astro123,问题涉及到numpy方法。非常感谢,我们能在numpy中也这样做吗?@astro123,问题是关于numpy方法的。