[英]Pandas pivot or groupby for dynamically generated columns
我在超市有一個帶有銷售信息的數據框。 數據框中的每一行代表一個項目,具有多個特征作為列。 原始的DataFrame是這樣的:
In [1]: import pandas as pd
my_data = [{'ticket_number' : '001', 'item' : 'tomato', 'ticket_price' : '21'},
{'ticket_number' : '001', 'item' : 'candy', 'ticket_price' : '21'},
{'ticket_number' : '001', 'item' : 'soup', 'ticket_price' : '21'},
{'ticket_number' : '002', 'item' : 'soup', 'ticket_price' : '12'},
{'ticket_number' : '002', 'item' : 'cola', 'ticket_price' : '12'},
{'ticket_number' : '003', 'item' : 'beef', 'ticket_price' : '56'},
{'ticket_number' : '003', 'item' : 'tomato', 'ticket_price' : '56'},
{'ticket_number' : '003', 'item' : 'pork', 'ticket_price' : '56'}]
df = pd.DataFrame(my_data)
In [2]: df
Out [2]:
ticket_number ticket_price item
0 001 21 tomato
1 001 21 candy
2 001 21 soup
3 002 12 soup
4 002 12 cola
5 003 56 beef
6 003 56 tomato
7 003 56 pork
我需要一個DataFrame,其中每一行代表一張票,所有購買的物品和票價格作為列。 在此示例中:
ticket_number ticket_price item1 item2 item3
0 001 21 tomato candy soup
1 002 12 soup cola
2 003 56 beef tomato pork
我嘗試使用df.groupby(ticket_number).item.value_counts()
,但這不會創建新列。 我從未使用過pivot_table
,也許它很有用。
任何幫助將不勝感激。
謝謝!
一種使用groupby制作其列表的方法,然后可以將其轉換為列:
In [24]: res = df.groupby(['ticket_number', 'ticket_price'])['item'].apply(list).apply(pd.Series)
In [25]: res
Out[25]:
0 1 2
ticket_number ticket_price
001 21 tomato candy soup
002 12 soup cola NaN
003 56 beef tomato pork
然后,清除此結果后:
In [27]: res.columns = ['item' + str(i + 1) for i in res.columns]
In [29]: res.reset_index()
Out[29]:
ticket_number ticket_price item1 item2 item3
0 001 21 tomato candy soup
1 002 12 soup cola NaN
2 003 56 beef tomato pork
創建新列的另一種可能方法是用groupby.cumcount
對每個組中的項目進行groupby.cumcount
:
In [38]: df['item_number'] = df.groupby('ticket_number').cumcount()
In [39]: df
Out[39]:
item ticket_number ticket_price item_number
0 tomato 001 21 0
1 candy 001 21 1
2 soup 001 21 2
3 soup 002 12 0
4 cola 002 12 1
5 beef 003 56 0
6 tomato 003 56 1
7 pork 003 56 2
然后進行一些重塑:
In [40]: df.set_index(['ticket_number', 'ticket_price', 'item_number']).unstack(-1)
Out[40]:
item
item_number 0 1 2
ticket_number ticket_price
001 21 tomato candy soup
002 12 soup cola NaN
003 56 beef tomato pork
從這里開始,通過一些列名稱的清理,您可以實現與上面相同的效果。
使用set_index
和untack
重塑的步驟也可以通過pivot_table
完成: df.pivot_table(columns=['item_number'], index=['ticket_number', 'ticket _price'], values='item', aggfunc='first')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.