以下是评级为 1,2 或 3 星的项目的示例。\n我正在尝试计算每月项目评级(星级)的所有组合。
\n在以下示例中,项目 10 在第 1 个月进行了评级,并且有两个评级等于 1、一个评级等于 2、一个评级等于 3。
\ninp = pd.DataFrame({'month':[1,1,1,1,1,2,2,2], \n 'item':[10,10,10,10,20,20,20,20], \n 'star':[1,2,1,3,3,2,2,3]}\n )\n\n month item star\n0 1 10 1\n1 1 10 2\n2 1 10 1\n3 1 10 3\n4 1 20 3\n5 2 20 2\n6 2 20 2\n7 2 20 3\nRun Code Online (Sandbox Code Playgroud)\n对于上面给定的输入帧输出应该是:
\n month item star_1_cnt star_2_cnt star_3_cnt\n0 1 10 2 1 1\n1 1 20 0 0 1\n2 2 20 0 2 1\nRun Code Online (Sandbox Code Playgroud)\n我试图从以下代码开始解决问题,\n该结果仍然需要转换为输出帧的所需格式,并且给出了错误的答案:
\n1 20 3 (1, 1)\n2 20 3 (1, 1)\nRun Code Online (Sandbox Code Playgroud)\n无论如何,应该有一种更好的方法来创建输出表,然后完成这个:
\nmonths = [1,2]\nitems = [10,20]\nstars = [1,2,3]\n\nd = {'month': [], 'item': [], 'star': [], 'star_cnts': [] }\n\nfor month in months:\n for star in stars:\n for item in items:\n star_cnts=dict(inp[(inp['item']==item) & (inp['star']==star)].value_counts()).values()\n d['month'].append(month)\n d['item'].append(item)\n d['star'].append(star)\n d['star_cnts'].append(star_cnts)\n \npd.DataFrame(d)\n\n month item star star_cnts\n0 1 10 1 (2)\n1 1 20 1 ()\n2 1 10 2 (1)\n3 1 20 2 (2)\n4 1 10 3 (1)\n5 1 20 3 (1, 1)\n6 2 10 1 (2)\n7 2 20 1 ()\n8 2 10 2 (1)\n9 2 20 2 (2)\n10 2 10 3 (1)\n11 2 20 3 (1, 1)\nRun Code Online (Sandbox Code Playgroud)\n\xe2\x80\x8b
\n小智 1
这对于以下人来说似乎是一个很好的问题pd.get_dummies:
new_df = (
pd.concat([df, pd.get_dummies(df['star'])], axis=1)
.groupby(['month', 'item'], as_index=False)
[df['star'].unique()]
.sum()
)
Run Code Online (Sandbox Code Playgroud)
输出:
>>> new_df
month item 1 2 3
0 1 10 2 1 1
1 1 20 0 0 1
2 2 20 0 2 1
Run Code Online (Sandbox Code Playgroud)
也重命名:
u = df['star'].unique()
new_df = (
pd.concat([df, pd.get_dummies(df['star'])], axis=1)
.groupby(['month', 'item'], as_index=False)
[u]
.sum()
.rename({k: f'star_{k}_cnt' for k in df['star'].unique()}, axis=1)
)
Run Code Online (Sandbox Code Playgroud)
输出:
>>> new_df
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
Run Code Online (Sandbox Code Playgroud)
强制性的一个(或两个)衬垫:
# Renames the columns
u = df['star'].unique()
new_df = pd.concat([df, pd.get_dummies(df['star'])], axis=1).groupby(['month', 'item'], as_index=False)[u].sum().rename({k: f'star_{k}_cnt' for k in df['star'].unique()}, axis=1)
Run Code Online (Sandbox Code Playgroud)