Python:寻找重复索引累积和的有效方法(numpy方法)
我有一个2d numpy数组,在第一列中有重复的值。 重复的值可以在第二列中有任何对应的值 使用numpy很容易找到总和,但是,我必须找到所有重复值的总和 我们如何才能有效地使用numpy或pandas 在这里,我使用无效for循环解决了这个问题。 我想知道是否有更优雅的解决方案 问题 我们如何才能以更有效的方式获得相同的结果 我们将不胜感激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
#!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方法的。