我有一個顯示訂單交易的資料框架,但我正在努力尋找一種方法來列出最經常購買的紅葡萄酒的搭配。我以前在某個地方看到過,但我似乎想不起怎么做。
import pandas as pd
df_orders = pd.DataFrame(
{'Order': [300,300,301,301。 301,302,302,303,303】。]
'Item':['Red wine','Chicken chop','Red wine'。
'夏威夷比薩','花園沙拉','雞排'。
'礦泉水','花園沙拉','紅葡萄酒']})
訂單專案
0 300 紅葡萄酒
1 300 雞排
2 301 紅葡萄酒
3 301夏威夷披薩
4 301花園沙拉
5 302 雞排
6 302 礦泉水
7 303花園沙拉
8 303 紅葡萄酒
我的目的是找到與紅酒同時被訂購的最頻繁的專案。 預期的輸出:
Item
0花園沙拉 2
1 雞排 1
2夏威夷比薩 1
我嘗試使用groupby、counter和其他一些東西,但沒有得到想要的輸出。希望有比我更優秀的人可以幫助我解決這個問題。謝謝你。
uj5u.com熱心網友回復:
只過濾有 "紅酒 "的訂單號碼,然后使用Series.value_counts來計算專案。
df[df.Order.isin(df[df.Item == 'Red wine'].Order)].Item.value_counts() .drop('Red wine')
uj5u.com熱心網友回復:
通常的建議是不要在一個DataFrame上回圈。因此,如果你的DataFrame變得更大,這可能不是一個有效的解決方案。
。我的處理方法是瀏覽每個獨特的訂單。從所有訂單中收集所有專案。檢查 "紅酒 "是否是其中一個專案。如果是,則將其他專案添加到字典中。
隨后將字典轉換回一個 DataFrame。
d = dict()
for order in set(df_orders.Order)。
items = list(df_orders[df_orders.Order == order].Item)
if 'Red wine' in items:
for it in items:
if it != 'Red wine':
if it in d.keys()。
d[it] =1
else:
d[it] = 1.
output = pd.DataFrame(d.items(), columns=['item', 'count'] )
print(output)
專案數
0 Chicken chop 1
1 夏威夷比薩 1
2花園沙拉 2
uj5u.com熱心網友回復:
你可以考慮使用一個過濾器和分組,如下所示
orders_with_red_wine = df_orders[
df_orders["Item"].eq("Red wine")]["Order"].unique()
df_orders[
df_orders["Item"].ne("Red wine") &
df_orders["Order"].isin(orders_with_red_wine)]
.groupby("Item") .size()
.sort_values(ascending=False)
.reset_index(name="count")
輸出
專案計數
0 花園沙拉 2
1 夏威夷披薩 1
2 雞排 1
解說
訂單。
orders_with_red_wine.df_orders[
df_orders["Item"].ne("Red wine") &
df_orders["Order"].isin(orders_with_red_wine)]
- 最后,它只是一個按專案分組和計數的問題。
uj5u.com熱心網友回復:
我分兩步完成,沒有回圈,一步是選擇'Red wine'訂單號,然后過濾到這些訂單并洗掉'Red wine'行,然后使用value_counts產生頻率表,最后進行一些重命名以符合你想要的輸出
>>> orders = df_orders. loc[data['Item'] == 'Red wine']['Order'].value
>>> orders
array([300, 301, 303] )
>>> data.loc[df_orders['Order'].isin(orders) & ~df_orders['Item'].eq('Red wine') ]
.專案
.value_counts()
.rename_axis('item')
.reset_index(name='counts')
專案計數
0花園沙拉 2
1 夏威夷比薩 1
2 雞排 1
uj5u.com熱心網友回復:
如果你只想計算某一列的頻率,你可以把它設定為索引,并對它使用index.value_counts()。
# reset index and save to new DataFrame
df = df_orders.reset_index()
# set index to 'Item' column
df1 = df.set_index('Item' )
# get orders, where 'Red wine' is purchased at same time[/span
orders = df1.loc['Red wine']['order']
# set index to 'Order' column, filter with the orders selected above;
df2 = df.set_index('Order').loc[orders]
# reset index to Item again[/span
res = df2.reset_index().set_index('Item')
# optional: remove 'Red wine' if you don't want to show them
res = res.loc[res.index != 'Red wine']
#呼叫索引方法value_counts。
ret = res.index.value_counts()
# print your result: 訂單包括'紅酒',并列出其他物品一起購買的頻率。
print(ret)
你也可以使用index.value_counts(normalize=True)通過將所有的值除以值的總和來回傳相對頻率。
PS:API到pandas.index.value_counts()
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/309186.html
標籤:
下一篇:DataFrame值,如果宣告
