熊猫:groupby列出

时间:2018-10-29 02:16:23

标签: python pandas

我有如下数据:

id  value   time

1   5   2000
1   6   2000
1   7   2000
1   5   2001
2   3   2000
2   3   2001
2   4   2005
2   5   2005
3   3   2000
3   6   2005

我的最终目标是将数据包含在以下列表中:

[[5,6,7],[5]] (this is for id 1 grouped by the id and year)
[[3],[3],[4,5]] (this is for id 2 grouped by the id and year)
[[3],[6]] (same logic as above)

我已使用df.groupby(['id', 'year'])对数据进行了分组。但是之后,我将无法访问组并以上述格式获取数据。

3 个答案:

答案 0 :(得分:3)

您可以使用apply(list)

>>> df.groupby(['id', 'time'])['value'].apply(list)

id  time
1   2000    [5, 6, 7]
    2001          [5]
2   2000          [3]
    2001          [3]
    2005       [4, 5]
3   2000          [3]
    2005          [6]
Name: value, dtype: object

如果您确实希望使用与显示的格式完全相同的格式,则可以按id分组并再次应用list ,但这并不高效,而且该格式可以说,与之合作更难...

>>> df.groupby(['id','time'])['value'].apply(list).groupby('id').apply(list).tolist()
[[[5, 6, 7], [5]], [[3], [3], [4, 5]], [[3], [6]]]

答案 1 :(得分:2)

您可以执行以下操作:

import pandas as pd

data = [[1, 5, 2000],
        [1, 6, 2000],
        [1, 7, 2000],
        [1, 5, 2001],
        [2, 3, 2000],
        [2, 3, 2001],
        [2, 4, 2005],
        [2, 5, 2005],
        [3, 3, 2000],
        [3, 6, 2005]]

df = pd.DataFrame(data=data, columns=['id', 'value', 'year'])

result = []
for name, group in df.groupby(['id']):
    result.append([g['value'].values.tolist() for _, g in group.groupby(['year'])])

for e in result:
    print(e)

输出

[[5, 6, 7], [5]]
[[3], [3], [4, 5]]
[[3], [6]]

答案 2 :(得分:0)

如果要计算多列列表,则可以执行以下操作:

df = pd.DataFrame(
    {'A': [1,1,2,2,2,2,3],
     'B':['a','b','c','d','e','f','g'],
     'C':['x','y','z','x','y','z','x']})

df.groupby('A').agg({ 'B': lambda x: list(x),'C': lambda x: list(x)})

将同时计算B和C的列表:

              B             C
A                            
1        [a, b]        [x, y]
2  [c, d, e, f]  [z, x, y, z]
3           [g]           [x]