Pandas:groupby 列出

Jad*_*Sen 4 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
Run Code Online (Sandbox Code Playgroud)

我的最终目标是将数据放在如下列表中:

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

我已经使用df.groupby(['id', 'year']). 但在那之后,我无法访问组并以上述格式获取数据。

sac*_*cuL 14

您可以使用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
Run Code Online (Sandbox Code Playgroud)

如果你真的想要它显示的确切格式,你可以 groupbyidlist 再次申请,但这效率不高,而且这种格式可以说更难使用......

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


tot*_*ico 13

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

import pandas as pd

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': list,'C': list})
Run Code Online (Sandbox Code Playgroud)

这将计算 B 和 C 的列表:

              B             C
A                            
1        [a, b]        [x, y]
2  [c, d, e, f]  [z, x, y, z]
3           [g]           [x]
Run Code Online (Sandbox Code Playgroud)

要获取所有列的列表:

df.groupby('A').agg(list)
Run Code Online (Sandbox Code Playgroud)

要对列表进行排序:

df.groupby('A').agg(sorted)
Run Code Online (Sandbox Code Playgroud)