我有兩個資料框(選單和訂單),我想根據它的受歡迎程度(它在'訂單'資料框中出現的次數)來標記選單資料框中的專案。
import pandas as pd
選單 = pd.DataFrame(
{'Item_Name':['Chicken Pizza','Mushroom Soup','Tiramisu'] 。
'Price': [8.99, 4.99, 5.99]})
訂單 = pd.DataFrame(
{'order': [1,2,3,4, 5,6,7,8】。]
'Item Name': ['雞肉比薩','蘑菇湯','提拉米蘇','雞肉比薩'。 '雞肉比薩','蘑菇湯','雞肉比薩','提拉米蘇']})
menu
Item_Name Price
0 雞肉比薩 8.99
1 蘑菇湯 4.99
2提拉米蘇 5.99
訂單
訂單 專案名稱
0 1 雞肉比薩
1 2 蘑菇湯
2 3 提拉米蘇
3 4 雞肉比薩
4 5 雞肉披薩
5 6 蘑菇湯
6 7 雞肉比薩
7 8 提拉米蘇
期望的輸出。 如果訂購的專案多于所有訂購專案的中位數,則為 "1";如果少于或等于訂購次數的中位數,則為 "0"
。 Item_Name Price Popular
0 雞肉比薩 8.99 1
1 蘑菇湯 4.99 0
2提拉米蘇 5.99 0
我試著用這個語法,但它不起作用。
menu["Popular"] = lambda x: 1 if orders["Item Name"] 。 count() > orders["Item Name"].median() else 0。
uj5u.com熱心網友回復:
我們需要groupby count來獲得每個專案的數量。然后我們可以將其與median的counts而不是整個DataFrame進行比較,將True/False值轉換為1/0(astype),以及join回到menu上的Item_Name列:
counts = orders.groupby('Item Name') ['Item Name'].count()
選單 = menu.join(
(counts > counts.median()).astype(int).rename('人氣')。
on='Item_Name'。
)
或者用Series.value_counts代替groupby count:
counts = orders['Item Name'].value_counts()
選單 = menu.join(
(counts > counts.median()).astype(int).rename('人氣')。
on='Item_Name'。
)
無論哪種方式都會得到menu:
Item_Name Price Popular
0 雞肉比薩 8.99 1
1 蘑菇湯 4.99 0
2提拉米蘇 5.99 0
uj5u.com熱心網友回復:
你可以 groupby "Item Name" size 來計算專案,然后計算中位數并找到大于(gt)它的元素。輸出是一個布林值,通過改變型別轉換為int。最后合并輸出的0/1s系列與 "選單":
s = orders.groupby('Item Name').size()
menu.merge(s.gt(s.median()).astype(int).rename('人氣')。
left_on='Item_Name', right_index=True)
輸出:
Item_Name Price Popular
0 雞肉比薩 8.99 1
1 蘑菇湯 4.99 0 蘑菇湯
2提拉米蘇 5.99 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/321092.html
標籤:
下一篇:替換一個陣列中的全部元素
