2016-06-22 6 views
2

Я пытаюсь использовать Pandas pivot_table для перемещения позиций в своих квитанциях в виде столбцов, оставляя только одну строку за квитанцию. Моя главная задача - назвать мои новые столбцы, подсчитывая числа по мере необходимости и заполнить NaNs.Pandas Pivot table - инкрементные имена столбцов

Я пытаюсь сделать это:

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 

... выглядеть следующим образом:

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 

Я пытался заставить его работать, но я не близко.

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

ответ

1

Я думаю, что вам нужно cumcount для создания имен столбцов и удалить [] от параметра 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

Спасибо, Изераэль! Ваше решение отлично работает. На 33-миллиметровых рядах, в среднем по 2 штуки за квитанцию, он работал 20 минут, используя оперативную память 58 ГБ. В некоторых квитанциях было до 30 наименований. Я сбросил все числовые столбцы> 8. – user6453877

+0

Рад может вам помочь! Приятный день! – jezrael

1

альтернативное решение (это может быть медленнее, - я не проверял сроки):

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 
Смежные вопросы