Groupby列表中的多个列

时间:2018-02-05 09:14:26

标签: python

我有一个列表,如下所示

[['H1','L', '1']
['H1','S', '1']
['H2','L', '1']
['H2','L', '1']]

并希望基于column1和column2进行分组。 python是否在列表中提供了我可以获得以下结果的任何内容

H1 L 1
H1 S 1
H2 L 2

6 个答案:

答案 0 :(得分:4)

您可以使用itertools.groupby,并将每个组的最后一列相加。

from itertools import groupby

out = []
for k, v in groupby(l, key=lambda x: x[:2]):
    s = sum([int(x[-1]) for x in v])
    out.append(k + [s])

print (out)
# [['H1', 'L', 1], ['H1', 'S', 1], ['H2', 'L', 2]]

答案 1 :(得分:4)

您可以使用itertools.groupbyoperator.itemgetter来获得所需的结果

>>> from operator import itemgetter
>>> from itertools import groupby

>>> items = [['H1','L', '1'], ['H1','S', '1'], ['H2','L', '1'], ['H2','L', '1']]
>>> [(*k,sum([int(itemgetter(2)(i)) for i in list(g)])) for k,g in groupby(items,key=itemgetter(0,1))]
>>> [('H1', 'L', 1), ('H1', 'S', 1), ('H2', 'L', 2)]

答案 2 :(得分:1)

另一个选择是使用pandas:

import pandas as pd
df = pd.DataFrame([['H1','L', 1],['H1','S', 1],['H2','L', 1],['H2','L', 1]],columns=['H','LS','1'])
df.groupby(['H','LS']).sum()

返回

       1
H  LS
H1 L   1
   S   1
H2 L   2

>>> df.groupby(['H','LS']).sum().reset_index()
    H LS  1
0  H1  L  1
1  H1  S  1
2  H2  L  2

答案 3 :(得分:0)

使用itertools groupby和自定义键获取所需的列:

groupby(l, key = lambda x: (x[0], x[1]) )

这里有一个与此代码对应的live example

l = [
  ['H1','L', '1'],
  ['H1','S', '1'],
  ['H2','L', '1'],
  ['H2','L', '1']
]

import itertools as it 


for k, v in it.groupby(l, key = lambda x: (x[0], x[1]) ):
  print(list(v)[0])

结果:

['H1', 'L', '1']
['H1', 'S', '1']
['H2', 'L', '1']

答案 4 :(得分:0)

以下代码有效,

items = [['H1','L', '1'],
['H1','S', '1'],
['H2','L', '1'],
['H2','L', '1']]

from collections import defaultdict

dictionary = defaultdict(int)

for item in items:
  dictionary[tuple(item[:2])]+=int(item[2])

for key in dictionary:
  print(key[0], key[1], dictionary[key])

答案 5 :(得分:0)

您可以使用哈希对象来存储和查找。这应该很快。

test=[['H1','L', '1'],
['H1','S', '1'],
['H2','L', '1'],
['H2','L', '1']]

d = {}
for x, y, z in test:
  d[(x, y)] = d.get((x,y), 0) + 1

print(d)
# -> {('H1', 'L'): 1, ('H1', 'S'): 1, ('H2', 'L'): 2}