Python中的列表或NumPy中相当于Excel的SUMIF函数是什么?

3

我有一个二维数组:

expenses = np.array([['jim', 'sam', 'bill', 'sam'],[1,2,6,5]])

我希望能够得到每个独特人员的总支出,并将其存储在新数组中,而不需要硬编码任何名称(真实列表非常长),以便我可以获得以下输出结果:
totals = [['jim', 'sam', 'bill'],[1,7,6]]

有没有使用列表或NumPy的方法来完成这个操作?我不想使用Pandas。
提前感谢!

4
你不想使用 pandas,是否有原因?在 pandas 中,这是一个简单的 groupby 操作,但在 numpy 中,你需要遍历键和索引,然后求和。 - it's-yer-boy-chet
2个回答

6
names = np.asarray(['jim', 'sam', 'bill', 'sam'])
values = np.asarray([1, 2, 6, 5])
result = {name: values[names == name].sum() for name in np.unique(names)}

谢谢你的回答,Chet!我看到你的代码可以运行,但是当我尝试将其转换为我的脚本时,对于名称,我会得到“无法将字符串转换为浮点数”的错误。不太确定为什么它要将名称转换为数字。我正在使用以下代码加载数据: names, values = np.loadtxt('data.txt', delimiter=',', unpack=True, dtype='str' - Haddock-san
没事了,我通过将每列分别分隔到具有特定dtype的数组中来解决它:namess = np.loadtxt('data.txt', delimiter=',', dtype='str', usecols=[0]) values = np.loadtxt('data.txt', delimiter=',', dtype='int', usecols=[1]) - Haddock-san

0
另一种有趣的方法(不使用numpy)是使用Counter
from collections import Counter
names = ['jim', 'sam', 'bill', 'sam']
counts = [1,2,6,5]
c = Counter()
for name, count in zip(names,counts):
    c[name] += count
# Remapping of dict to list of lists
list(map(list, zip(*c.items())))

输出:

[['sam', 'jim', 'bill'], [7, 1, 6]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接