如何对列表中其他列分组的列进行求和?

Dee*_*eqe 15 python list dataframe pandas pandas-groupby

我有一个如下列表.

[['Andrew', '1', '9'], ['Peter', '1', '10'], ['Andrew', '1', '8'], ['Peter', '1', '11'], ['Sam', '4', '9'], ['Andrew', '2', '2']]
Run Code Online (Sandbox Code Playgroud)

我想总结由其他列分组的最后一列.结果是这样的

[['Andrew', '1', '17'], ['Peter', '1', '21'], ['Sam', '4', '9'], ['Andrew', '2', '2']]
Run Code Online (Sandbox Code Playgroud)

这仍然是一个清单.

在实际操作中,我总是想总结由许多其他列分组的最后一列.有没有办法在Python中做到这一点?非常感激.

Max*_*axU 14

除最后一列之外的所有列动态分组:

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]]
Run Code Online (Sandbox Code Playgroud)


jpp*_*jpp 10

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

如果您想要的输出是一个列表,那么这可能比通过Pandas的解决方案更可取,这需要转换为非标准类型和从非标准类型转换.

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())]
Run Code Online (Sandbox Code Playgroud)

结果

[['Andrew', '1', 17], ['Andrew', '2', 2], ['Peter', '1', 21], ['Sam', '4', 9]]
Run Code Online (Sandbox Code Playgroud)

说明

  • 循环浏览列表列表,定义键/值并添加到defaultdict列表中.
  • 使用列表推导将字典转换为所需的输出.


WeN*_*Ben 9

OP1

您可以传递索引sum 并将tolist转换回列表

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]]
Run Code Online (Sandbox Code Playgroud)

OP2

对于名单列表中,您可以使用groupbyitertools

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]]
Run Code Online (Sandbox Code Playgroud)


jez*_*ael 7

DataFrame通过第一列和第二列创建并聚合第三列转换为整数,最后转换回lists:

df = pd.DataFrame(L)
L = df[2].astype(int).groupby([df[0], df[1]]).sum().reset_index().values.tolist()
print (L)
[['Andrew', '1', 17], ['Andrew', '2', 2], ['Peter', '1', 21], ['Sam', '4', 9]]
Run Code Online (Sandbox Code Playgroud)

defaultdict的解决方案,仅限python 3.x:

from collections import defaultdict

d = defaultdict(int)
#https://stackoverflow.com/a/10532492
for *head, tail in L:
    d[tuple(head)] += int(tail)

d = [[*i, j] for i, j in sorted(d.items())]
print (d)
[['Andrew', '1', 17], ['Andrew', '2', 2], ['Peter', '1', 21], ['Sam', '4', 9]]
Run Code Online (Sandbox Code Playgroud)


piR*_*red 6

pd.factorizenp.bincount

f, u = pd.factorize([tuple(x[:-1]) for x in data])
v = np.array([x[-1] for x in data], int)

[list(k) + [int(v)] for k, v in zip(u, np.bincount(f, v))]

[['Andrew', '1', 17], ['Peter', '1', 21], ['Sam', '4', 9], ['Andrew', '2', 2]]
Run Code Online (Sandbox Code Playgroud)