【问题标题】:What is the Python list or NumPy equivalent of Excel's SUMIF function?Excel 的 SUMIF 函数的 Python 列表或 NumPy 等价物是什么?
【发布时间】:2018-08-01 21:11:30
【问题描述】:

我有一个二维数组:

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

我想知道新数组中每个唯一人员的总费用,而无需硬编码任何名称(实际列表很长),以便得到如下输出:

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

有没有办法用列表或 NumPy 做到这一点?我不想为此使用 Pandas。

提前致谢!

【问题讨论】:

  • 你有什么不想使用 pandas 的原因吗?这是 pandas 中的简单 groupby,但在 numpy 中,您可以遍历键、索引,然后求和。

标签: python arrays list numpy


【解决方案1】:
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)}

【讨论】:

  • 感谢您的回答,切特!我看到您的代码有效,但是当我尝试将其转换为我的脚本时,我收到名称的“无法将字符串转换为浮点数”错误。不太清楚为什么它试图将名称转换为数字。我正在加载我的数据:names, values = np.loadtxt('data.txt', delimiter=',', unpack=True, dtype='str'
  • 没关系,我可以通过将每一列分成一个具有特定 dtype 的数组来修复它:namess = np.loadtxt('data.txt', delimiter=',', dtype='str', usecols=[0]) values = np.loadtxt('data.txt', delimiter=',', dtype='int', usecols=[1])
【解决方案2】:

另一种有趣的方法(没有 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]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 2016-01-10
    相关资源
    最近更新 更多