计算多列中值的所有组合

dok*_*ndr 9 python pandas

以下是评级为 1,2 或 3 星的项目的示例。\n我正在尝试计算每月项目评级(星级)的所有组合。

\n

在以下示例中,项目 10 在第 1 个月进行了评级,并且有两个评级等于 1、一个评级等于 2、一个评级等于 3。

\n
inp = 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\n
Run 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\n
Run Code Online (Sandbox Code Playgroud)\n

我试图从以下代码开始解决问题,\n该结果仍然需要转换为输出帧的所需格式,并且给出了错误的答案:

\n
1   20  3   (1, 1)\n2   20  3   (1, 1)\n
Run Code Online (Sandbox Code Playgroud)\n

无论如何,应该有一种更好的方法来创建输出表,然后完成这个:

\n
months = [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)\n
Run 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)