2016-06-22 1 views
2

J'essaie d'utiliser les Pandas pivot_table pour déplacer des éléments de ligne sur mes réceptions en tant que colonnes, en ne laissant qu'une seule ligne par reçu. Mon principal défi est de nommer mes nouvelles colonnes en comptant les nombres et de les remplir de NaN.Tableau croisé dynamique Pandas - noms de colonne incrémentiels

Je suis en train de faire ceci:

customer_id receipt_id item_id 
01   100  420 
05   400  450 
05   400  460 
05   400  320 
05   400  270 
02   300  320 
02   300  460 
05   200  220 

... ressembler à ceci:

customer_id receipt_id 1  2  3  4 n.. 
01   100   420 NaN NaN NaN 
05   400   450 460 320 270 
02   300   320 460 NaN NaN 
05   200   220 NaN NaN Nan 

J'ai essayé de le faire fonctionner, mais je ne suis pas près.

pt = pd.pivot_table(df, values=["item_id"], index=["customer_id", "receipt_id"], columns=["item_id"], fill_value="NaN").reset_index() 

Répondre

1

Je pense que vous avez besoin cumcount pour créer des noms de colonnes et de supprimer [] du paramètre values:

df['g'] = df.groupby(['customer_id','receipt_id'])['item_id'].cumcount() + 1 

pt = pd.pivot_table(df, 
        values="item_id", 
        index=["customer_id", "receipt_id"], 
        columns="g", 
        fill_value="NaN").reset_index() 

print (pt) 

g customer_id receipt_id 1 2 3 4 
0   1   100 420 NaN NaN NaN 
1   2   300 320 460 NaN NaN 
2   5   200 220 NaN NaN NaN 
3   5   400 450 460 320 270 
+0

Merci Jezrael! Votre solution a fonctionné parfaitement. Sur les lignes de 33 millions, avec une moyenne de 2 articles par reçu, il a fonctionné sur 20 minutes en utilisant 58 Go de RAM. Certains reçus avaient jusqu'à 30 articles. J'ai laissé tomber toutes les colonnes numérotées> 8. – user6453877

+0

Glad peut vous aider! Belle journée! – jezrael

1

solution de rechange (il pourrait être plus lent - je n'ai pas testé le moment):

In [243]: df.groupby(['customer_id','receipt_id'])['item_id'].apply(list).apply(pd.Series).reset_index() 
Out[243]: 
    customer_id receipt_id  0  1  2  3 
0   1   100 420.0 NaN NaN NaN 
1   2   300 320.0 460.0 NaN NaN 
2   5   200 220.0 NaN NaN NaN 
3   5   400 450.0 460.0 320.0 270.0