Pandas如何基于另一列统计单列两类唯一值并新增列到原DataFrame
pandas按影片维度统计评级次数并新增字段实现方案
假设你持有的原始DataFrame名为df,其中包含影片名称列、评级列(值仅为1、2两类)及第三列业务字段,可按以下方法实现需求:
给原DataFrame新增*Grade1Sum、*Grade2Sum字段
直接用分组transform实现统计值按原表行对齐广播,同一影片的所有行将自动填充相同的累计统计值,和你举例的「ET所有行*Grade1Sum均为3」的逻辑完全一致,代码如下:
# 请将代码里的MovieName替换为你实际的影片列名,Grade替换为你实际的评级列名 df['*Grade1Sum'] = df.groupby('MovieName')['Grade'].transform(lambda x: (x == 1).sum()) df['*Grade2Sum'] = df.groupby('MovieName')['Grade'].transform(lambda x: (x == 2).sum())
单独按影片维度统计各评级出现次数
如果不需要把统计值拼回原表,仅需要各影片对应1、2级评分的次数统计结果,任选以下一种写法即可:
- 写法1:用交叉表快速生成统计结果
grade_stat = pd.crosstab(df['MovieName'], df['Grade']) grade_stat.columns = ['*Grade1Sum', '*Grade2Sum']
- 写法2:用分组聚合+长表转宽表实现
grade_stat = df.groupby(['MovieName', 'Grade']).size().unstack(fill_value=0) grade_stat.columns = ['*Grade1Sum', '*Grade2Sum']
效果验证
用测试数据跑通后的效果如下,完全匹配需求:
| 影片名 | 评级 | 评分人 | *Grade1Sum | *Grade2Sum |
|---|---|---|---|---|
| ET | 1 | 张三 | 3 | 1 |
| ET | 1 | 李四 | 3 | 1 |
| ET | 1 | 王五 | 3 | 1 |
| ET | 2 | 赵六 | 3 | 1 |
| 流浪地球 | 1 | 孙七 | 1 | 1 |
| 流浪地球 | 2 | 周八 | 1 | 1 |
内容的提问来源于stack exchange,提问作者user15950867
相关产品推荐
相关产品推荐

