以下是 1,2 或 3 星評級的專案示例。我正在嘗試每月計算所有專案評級(星級)的組合。
在以下示例中,專案 10 在第 1 個月被評級,并且有兩個評級等于 1,一個評級等于 2,一個評級等于 3。
inp = pd.DataFrame({'month':[1,1,1,1,1,2,2,2],
'item':[10,10,10,10,20,20,20,20],
'star':[1,2,1,3,3,2,2,3]}
)
month item star
0 1 10 1
1 1 10 2
2 1 10 1
3 1 10 3
4 1 20 3
5 2 20 2
6 2 20 2
7 2 20 3
對于上面給定的輸入幀輸出應該是:
month item star_1_cnt star_2_cnt star_3_cnt
0 1 10 2 1 1
1 1 20 0 0 1
2 2 20 0 2 1
我正在嘗試從以下代碼開始解決問題,該結果仍需要轉換為所需的輸出幀格式,并且給出了錯誤的答案:
1 20 3 (1, 1)
2 20 3 (1, 1)
無論如何,應該有更好的方法來創建輸出表,然后完成這個:
months = [1,2]
items = [10,20]
stars = [1,2,3]
d = {'month': [], 'item': [], 'star': [], 'star_cnts': [] }
for month in months:
for star in stars:
for item in items:
star_cnts=dict(inp[(inp['item']==item) & (inp['star']==star)].value_counts()).values()
d['month'].append(month)
d['item'].append(item)
d['star'].append(star)
d['star_cnts'].append(star_cnts)
pd.DataFrame(d)
month item star star_cnts
0 1 10 1 (2)
1 1 20 1 ()
2 1 10 2 (1)
3 1 20 2 (2)
4 1 10 3 (1)
5 1 20 3 (1, 1)
6 2 10 1 (2)
7 2 20 1 ()
8 2 10 2 (1)
9 2 20 2 (2)
10 2 10 3 (1)
11 2 20 3 (1, 1)
?
uj5u.com熱心網友回復:
您可以value_counts在整個 DataFrame 上使用并取消堆疊:
out = (
inp.value_counts()
.unstack('star', fill_value=0)
)
或者,您可以使用crosstab.
由于它需要一維資料作為輸入,您可以使用元組:
cols = ['month','item']
out = pd.crosstab(inp[cols].apply(tuple, axis=1), inp['star'])
out.index = pd.MultiIndex.from_tuples(out.index, names=cols)
輸出:
star 1 2 3
month item
1 10 2 1 1
20 0 0 1
2 20 0 2 1
格式化輸出
@ansev 已經很好地證明了這一點
(inp.value_counts()
.unstack('star', fill_value=0)
.rename(lambda c: f'star_{c}_cnt', axis=1)
.reset_index()
.rename_axis(columns=None)
)
輸出:
month item star_1_cnt star_2_cnt star_3_cnt
0 1 10 2 1 1
1 1 20 0 0 1
2 2 20 0 2 1
uj5u.com熱心網友回復:
一種選擇,使用 pivot_table :
(inp
.pivot_table(index=['month', 'item'],
values = 'star',
columns='star',
aggfunc='size',
fill_value = 0)
.rename(columns = lambda col: f"star_{col}_cnt")
.rename_axis(columns = None)
.reset_index()
)
month item star_1_cnt star_2_cnt star_3_cnt
0 1 10 2 1 1
1 1 20 0 0 1
2 2 20 0 2 1
另一個選項,使用 groupby(pivot_table 是 groupby unstack 的包裝):
(inp
.groupby(['month', 'item', 'star'])
.size()
.unstack(fill_value = 0)
.rename(columns = lambda col: f"star_{col}_cnt")
.rename_axis(columns = None)
.reset_index()
)
month item star_1_cnt star_2_cnt star_3_cnt
0 1 10 2 1 1
1 1 20 0 0 1
2 2 20 0 2 1
另一種選擇,使用pd.get_dummies groupby:
(pd.get_dummies(inp, columns=['star'])
.groupby(['month', 'item'])
.sum()
.add_suffix('_cnt')
.reset_index()
)
month item star_1_cnt star_2_cnt star_3_cnt
0 1 10 2 1 1
1 1 20 0 0 1
2 2 20 0 2 1
性能方面,只有測驗可以告訴 - 我希望 pivot_table 比 groupby 慢
uj5u.com熱心網友回復:
Series.value_counts Series.unstack轉換為資料框
out = inp.value_counts()\
.unstack('star', fill_value=0)\
.rename(lambda x: f'star_{x}_cnt', axis=1)\
.reset_index().rename_axis(columns=None)
print(out)
month item star_1_cnt star_2_cnt star_3_cnt
0 1 10 2 1 1
1 1 20 0 0 1
2 2 20 0 2 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/429574.html
