Pandas:groupby列A并列出其他列的元组列表?

MrC*_*ogy 12 python dataframe pandas pandas-groupby

我想将用户事务聚合到pandas中的列表中.我无法弄清楚如何制作一个包含多个字段的列表.例如,

df = pd.DataFrame({'user':[1,1,2,2,3], 
                   'time':[20,10,11,18, 15], 
                   'amount':[10.99, 4.99, 2.99, 1.99, 10.99]})
Run Code Online (Sandbox Code Playgroud)

看起来像

    amount  time  user
0   10.99    20     1
1    4.99    10     1
2    2.99    11     2
3    1.99    18     2
4   10.99    15     3
Run Code Online (Sandbox Code Playgroud)

如果我做

print(df.groupby('user')['time'].apply(list))
Run Code Online (Sandbox Code Playgroud)

我明白了

user
1    [20, 10]
2    [11, 18]
3        [15]
Run Code Online (Sandbox Code Playgroud)

但如果我这样做

df.groupby('user')[['time', 'amount']].apply(list)
Run Code Online (Sandbox Code Playgroud)

我明白了

user
1    [time, amount]
2    [time, amount]
3    [time, amount]
Run Code Online (Sandbox Code Playgroud)

感谢下面的回答,我了解到我可以做到这一点

df.groupby('user').agg(lambda x: x.tolist()))
Run Code Online (Sandbox Code Playgroud)

要得到

             amount      time
user                         
1     [10.99, 4.99]  [20, 10]
2      [2.99, 1.99]  [11, 18]
3           [10.99]      [15]
Run Code Online (Sandbox Code Playgroud)

但是我想要按照相同的顺序对时间和金额进行排序 - 所以我可以按顺序查看每个用户的交易.

我正在寻找一种方法来产生这个:

             amount-time-tuple
user                         
1     [(20, 10.99), (10, 4.99)]
2     [(11,  2.99), (18, 1.99)]
3     [(15, 10.99)]
Run Code Online (Sandbox Code Playgroud)

但也许有一种方法可以进行排序而不会"拼乱"两列?

Flo*_*oor 10

apply(list) 会考虑系列指数而不是价值.我认为你在寻找

df.groupby('user')[['time', 'amount']].apply(lambda x: x.values.tolist())
Run Code Online (Sandbox Code Playgroud)
user
1    [[23.0, 2.99], [50.0, 1.99]]
2                  [[12.0, 1.99]]


小智 8

为数量-时间元组创建一个新列atpair

 df['atpair'] = list(zip(df.amount, df.time))
Run Code Online (Sandbox Code Playgroud)

数据框看起来像

        user  time  amount       atpair
    0     1    20   10.99  (10.99, 20)
    1     1    10    4.99   (4.99, 10)
    2     2    11    2.99   (2.99, 11)
    3     2    18    1.99   (1.99, 18)
    4     3    15   10.99  (10.99, 15)
Run Code Online (Sandbox Code Playgroud)

现在执行 groupby 并将列表附加到atpair

 df = df.groupby('user')['atpair'].apply(lambda x : x.values.tolist())
Run Code Online (Sandbox Code Playgroud)

数据框看起来像

user
1    [(10.99, 20), (4.99, 10)]
2     [(2.99, 11), (1.99, 18)]
3                [(10.99, 15)]
Run Code Online (Sandbox Code Playgroud)