python - 对不包括某些条件的列执行 groupby 计算
问题描述
I have this df:
data = {'A':[102, 102, 102, 102, 312, 312, 312],
'B':[1001,1001,1001,1001,1001,1001,1001],
'C':[3005,3005,3005,3005,3005,3005,3005],
'D':[2004,2004,2004,2004,2002,2002,2002],
'E':[1,3,5,999,1,5,999],
'F':[300,1,192,837,19,1,1037]}
df = pd.DataFrame (data, columns = ['A','B','C','D','E','F'])
df.head(7)
一行代码计算除了我希望它排除 E 列中的行值为 (999) 的计数值之外的百分比:
df['Percentage'] = 100 * df['F'] / df.groupby('A')['F'].transform('sum')
百分比应显示:
Percentage
60.85193
0.20284
38.94523
(Blank)
95
5
(Blank)
任何帮助将不胜感激
解决方案
您可以对框架和transform
特定部分进行细分,然后重新分配结果:
# Get the sub group
>>> grp = df[df['E'].ne(999)]
# Not required: this shows the Intermediate state of the transformed percentage
>>> grp['F'].mul(100).div(grp.groupby('A')['F'].transform('sum'))
0 60.851927
1 0.202840
2 38.945233
4 95.000000
5 5.000000
Name: F, dtype: float64
# Apply the result to your main frame
>>> df['Percentage'] = grp['F'].mul(100).div(grp.groupby('A')['F'].transform('sum'))
结果:
>>> df
A B C D E F Percentage
0 102 1001 3005 2004 1 300 60.851927
1 102 1001 3005 2004 3 1 0.202840
2 102 1001 3005 2004 5 192 38.945233
3 102 1001 3005 2004 999 837 NaN
4 312 1001 3005 2002 1 19 95.000000
5 312 1001 3005 2002 5 1 5.000000
6 312 1001 3005 2002 999 1037 NaN
推荐阅读
- rstudio - 如何在 RStudio 中删除随机覆盖和模糊代码的面板
- mysql - 如何在不使用集合操作的情况下获取两个表中ID的所有值
- android - 尝试在图像视图中显示位图适用于应用程序但不适用于小部件
- c - 是否可以使用动态内存创建任意大小的整数?
- javascript - 如何打印过滤后的元素?
- c++ - 如何加载 C++ 模块并将编译标志作为 Rcpp 包编译的一部分?
- jupyter-notebook - 在 Pycharm 将环境设为解释器后,jupyter notebook 无法访问 anaconda 虚拟环境
- scala - 我是斯卡拉的新手。有人可以告诉我为什么在编写 def recur 函数时我得到一个错误非法启动简单函数
- qt - 无法在我的 QML 视图中使用 QTLocation 和 QTPositioning
- python - 按钮存在并显示单击了 Selenium python