web-dev-qa-db-fra.com

Pandas: grouper la colonne A et faire des listes de tuples à partir d'autres colonnes?

Je voudrais regrouper les transactions des utilisateurs en listes dans les pandas. Je ne sais pas comment créer une liste composée de plusieurs champs. Par exemple,

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

qui ressemble

    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

Si je fais

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

Je reçois

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

mais si je le fais

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

Je reçois

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

Grâce à une réponse ci-dessous, j'ai appris que je peux le faire

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

obtenir

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

mais je vais vouloir trier le temps et les montants dans le même ordre - afin que je puisse parcourir les transactions de chaque utilisateur dans l'ordre.

Je cherchais un moyen de produire ceci:

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

mais peut-être existe-t-il un moyen de faire le tri sans "coupler" les deux colonnes?

16
MrCartoonology

apply(list) tiendra compte de l'index de la série et non des valeurs. Je pense que vous recherchez

df.groupby('user')[['time', 'amount']].apply(lambda x: x.values.tolist())
 utilisateur 
 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