Python按多列分组

2024-10-06 11:25:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个列表列表-表示一个有4列和许多行的表(10000+)。在

每个子列表包含4个变量。在

这是我桌子的一小部分:

['1810569', 'a', 5, '1241.52']
['1437437', 'a', 5, '1123.90']
['1437437', 'b', 5, '1232.43']
['1810569', 'b', 5, '1321.31']
['1810569', 'a', 5, '1993.52']

第一列表示house hold ID,第二列表示家庭中的成员ID。在

第四列代表了我想对每个成员明确相加的权重。在

对于上面的示例,我希望输出为:

^{pr2}$

换句话说,第1行和第5行中的权重相加,因为它们是同一用户的权重,而所有其他用户都是不同的。在

我在熊猫身上看到了一些关于群居的东西,但我不明白该怎么用它来解决我的问题。在


Tags: 用户id示例列表家庭成员代表house
2条回答

假设下面是您的列表,那么下面的方法就可以了:

In [192]:
l=[['1810569', 'a', 5, '1241.52'],
['1437437', 'a', 5, '1123.90'],
['1437437', 'b', 5, '1232.43'],
['1810569', 'b', 5, '1321.31'],
['1810569', 'a', 5, '1993.52']]
l

Out[192]:
[['1810569', 'a', 5, '1241.52'],
 ['1437437', 'a', 5, '1123.90'],
 ['1437437', 'b', 5, '1232.43'],
 ['1810569', 'b', 5, '1321.31'],
 ['1810569', 'a', 5, '1993.52']]

In [201]:
# construct the df and convert the last column to float    
df = pd.DataFrame(l, columns=['household ID', 'Member ID', 'some col', 'weights'])
df['weights'] = df['weights'].astype(float)
df

Out[201]:
  household ID Member ID  some col  weights
0      1810569         a         5  1241.52
1      1437437         a         5  1123.90
2      1437437         b         5  1232.43
3      1810569         b         5  1321.31
4      1810569         a         5  1993.52

因此,我们现在可以groupby在家庭和成员id上,并在“权重”列中调用sum

^{pr2}$

您可以使用dict,使用前三个元素作为键对数据进行分组:

d = {}
for k, b, c, w in l:
    if (k, b, c) in d:
        d[k, b, c][-1] += float(w)
    else:
        d[k, b, c] = [k, b, c, float(w)]

from pprint import  pprint as pp

pp(list(d.values()))

输出:

^{pr2}$

如果你想保持第一眼看到的顺序:

from collections import OrderedDict
d = OrderedDict()
for k, b, c, w in l:
    if (k, b, c) in d:
        d[k, b, c][-1] += float(w)
    else:
        d[k, b, c] = [k, b, c, float(w)]

from pprint import pprint as pp

pp(list(d.values()))

输出:

[['1810569', 'a', 5, 3235.04],
 ['1437437', 'a', 5, 1123.9],
 ['1437437', 'b', 5, 1232.43],
 ['1810569', 'b', 5, 1321.31]]

相关问题 更多 >