首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将按列表中其他列分组的列相加?

如何将按列表中其他列分组的列相加?
EN

Stack Overflow用户
提问于 2018-03-28 13:48:50
回答 6查看 1.3K关注 0票数 15

我有一份清单如下。

代码语言:javascript
复制
[['Andrew', '1', '9'], ['Peter', '1', '10'], ['Andrew', '1', '8'], ['Peter', '1', '11'], ['Sam', '4', '9'], ['Andrew', '2', '2']]

我想总结按其他columns.The结果分组的最后一列,如下所示

代码语言:javascript
复制
[['Andrew', '1', '17'], ['Peter', '1', '21'], ['Sam', '4', '9'], ['Andrew', '2', '2']]

这仍然是一份名单。

在实际的实践中,我总是想总结最后一列被许多其他列分组。有什么方法可以用Python来完成吗?非常感谢。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2018-03-28 13:51:11

除最后一列外,按所有列动态分组:

代码语言:javascript
复制
In [24]: df = pd.DataFrame(data)

In [25]: df.groupby(df.columns[:-1].tolist(), as_index=False).agg(lambda x: x.astype(int).sum()).values.tolist()
Out[25]: [['Andrew', '1', 17], ['Andrew', '2', 2], ['Peter', '1', 21], ['Sam', '4', 9]]
票数 14
EN

Stack Overflow用户

发布于 2018-03-28 13:55:43

这是一个通过collections.defaultdict的O(n)解决方案,适用于任意数量的键。

如果您想要的输出是一个列表,那么这可能比通过Pandas的解决方案更好,因为Pandas需要对非标准类型进行转换。

代码语言:javascript
复制
from collections import defaultdict

lst = [['Andrew', '1', '9'], ['Peter', '1', '10'], ['Andrew', '1', '8'],
       ['Peter', '1', '11'], ['Sam', '4', '9'], ['Andrew', '2', '2']]

d = defaultdict(int)

for *keys, val in lst:
    d[tuple(keys)] += int(val)

res = [[*k, v] for k, v in sorted(d.items())]

结果

代码语言:javascript
复制
[['Andrew', '1', 17], ['Andrew', '2', 2], ['Peter', '1', 21], ['Sam', '4', 9]]

解释

  • 循环遍历列表列表,定义键/值,并添加到列表的defaultdict中。
  • 使用列表理解将字典转换为所需的输出。
票数 10
EN

Stack Overflow用户

发布于 2018-03-28 13:54:03

Op1

您可以传递一个索引sum并将收费列表转换回列表。

代码语言:javascript
复制
pd.DataFrame(L).\
   set_index([0,1])[2].astype(int).sum(level=[0,1]).\
        reset_index().values.tolist()
Out[78]: [['Andrew', '1', 17], ['Peter', '1', 21], ['Sam', '4', 9], ['Andrew', '2', 2]]

Op2

对于列表列表,您可以使用来自groupbyitertools

代码语言:javascript
复制
from itertools import groupby
[k+[sum(int(v) for _,_, v in g)] for k, g in groupby(sorted(l), key = lambda x: [x[0],x[1]])]
Out[98]: [['Andrew', '1', 17], ['Andrew', '2', 2], ['Peter', '1', 21], ['Sam', '4', 9]]
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49536332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档