web-dev-qa-db-ja.com

パンダ:groupby列Aと他の列からタプルのリストを作成しますか?

ユーザーのトランザクションをパンダのリストに集約したいと思います。複数のフィールドで構成されるリストを作成する方法がわかりません。例えば、

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

のように見えます

    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

私が行った場合

print(df.groupby('user')['time'].apply(list))

私は得る

user
1    [20, 10]
2    [11, 18]
3        [15]

でも私がやれば

df.groupby('user')[['time', 'amount']].apply(list)

私は得る

user
1    [time, amount]
2    [time, amount]
3    [time, amount]

以下の回答のおかげで、私はこれを行うことができることを学びました

df.groupby('user').agg(lambda x: x.tolist()))

取得するため

             amount      time
user                         
1     [10.99, 4.99]  [20, 10]
2      [2.99, 1.99]  [11, 18]
3           [10.99]      [15]

時間と金額を同じ順序でソートしたいので、各ユーザーのトランザクションを順番に実行できます。

これを作成する方法を探していました:

             amount-time-Tuple
user                         
1     [(20, 10.99), (10, 4.99)]
2     [(11,  2.99), (18, 1.99)]
3     [(15, 10.99)]

しかし、2つの列を「タプル」せずに並べ替えを行う方法があるのでしょうか。

16
MrCartoonology

apply(list)は、値ではなくシリーズのインデックスを考慮します。

df.groupby('user')[['time', 'amount']].apply(lambda x: x.values.tolist())
ユーザー
 1 [[23.0、2.99]、[50.0、1.99]] 
 2 [[12.0、1.99]] 
10
Bharath M

IIUC:

In [101]: df.groupby('user').agg(lambda x: x.tolist())
Out[101]:
          time        amount
user
1     [23, 50]  [2.99, 1.99]
2         [12]        [1.99]
1
MaxU