python - Pandas 分组计数和比例

标签 python pandas

我正在尝试做一些我知道必须是基本 Pandas 的事情,但我正在绞尽脑汁想办法解决这个问题。我希望每个组的比例和计数可用于任意级别的分组:

import pandas as pd

df = pd.DataFrame({'A': [1, 0, 1, 0, 1, 0, 0, 0], 'B': ['A'] * 4 + ['B'] * 4})

gb = df.groupby(['A', 'B']).size()

prop_gb = gb / gb.groupby(level=0).sum()
prop_gb 现在是:
prop_gb
Out[116]: 
A  B
0  A    0.400000
   B    0.600000
1  A    0.666667
   B    0.333333
dtype: float64

不过,我最终想要这个:
A  B        prop  count
0  A    0.400000      2
   B    0.600000      3
1  A    0.666667      2
   B    0.333333      1

我已经尝试合并两个 pandas.Series 对象,gbprop_gb,方法是将它们转换为字典并以这种方式“加入”它们,但我知道必须有一种原生的 Pandas 方式来完成这个......

这在技术上实现了我想要的:
desired = {k: (v, prop_gb.to_dict()[k]) for k, v in gb.to_dict().items()}
desired
{(0, 'A'): (2, 0.40000000000000002),
 (0, 'B'): (3, 0.59999999999999998),
 (1, 'A'): (2, 0.66666666666666663),
 (1, 'B'): (1, 0.33333333333333331)}

最佳答案

您可以只使用 to_frame 创建一个数据帧开始并添加 prop 列:

>>> desired = df.groupby(['A', 'B']).size().to_frame('count')
>>> desired['prop'] = gb / gb.groupby(level=0).sum()
>>> desired
     count      prop
A B                 
0 A      2  0.400000
  B      3  0.600000
1 A      2  0.666667
  B      1  0.333333

或者,从 2 系列创建一个新框架:
>>> pd.DataFrame(dict(prop=prop_gb, count=gb))
     count      prop
A B                 
0 A      2  0.400000
  B      3  0.600000
1 A      2  0.666667
  B      1  0.333333

关于python - Pandas 分组计数和比例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46003482/

相关文章:

python - DASK:当一方的 key 为 NA 时,合并会抛出错误,而 pd.merge 有效

python - 根据索引和列名逐个单元填充整个数据框?

python - 使用 pandas 将 DataFrame 写入 html 时应用样式映射

python - Pandas 打印所有 dtypes

python - 使用 Python 删除重叠的元组值

python - 如何在 virtualenv 上安装 GExiv2?

python - 如何在 ModelAdmin 中动态操作 Django 中的表单字段?

python - 如何在 Django 中重命名 'save' 按钮?

python - 如果行出现两次以上,如何删除重复项?

python - 我如何在 python 中检查/验证现有文件是否符合我的要求