Python - 按多列分组

时间:2016-02-17 11:57:44

标签: python list

我有一个列表列表 - 表示一个包含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']

第一列代表家庭住宅ID,第二列代表家庭中的会员ID。

第四列表示我想要求和的权重 - 对每个成员来说都是明显的。

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

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

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

我在熊猫中看到了关于群体的一些事情 - 但我并不了解如何将它用于我的问题。

2 个答案:

答案 0 :(得分: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

In [200]:    
df.groupby(['household ID', 'Member ID'])['weights'].sum().reset_index()

Out[200]:
  household ID Member ID  weights
0      1437437         a  1123.90
1      1437437         b  1232.43
2      1810569         a  3235.04
3      1810569         b  1321.31

答案 1 :(得分:0)

您可以使用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()))

输出:

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

如果您想维持首次看到的订单:

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]]