【问题标题】:Writing a custom function for groupby column为 groupby 列编写自定义函数
【发布时间】:2019-03-14 19:14:10
【问题描述】:
尝试编写以下自定义 groupby 函数来计算给定二进制列 b 中 1 的百分比:
def _get_perc(ds):
try:
return ds.value_counts(normalize=True).loc[1]
except KeyError:
return 0.0
df[['group','b']].groupby('group').apply(_get_perc)
但是 pandas 将 ds 作为数据框而不是系列;它给了我一个
AttributeError: 'DataFrame' 对象没有属性 'value_counts'。
我应该如何编写将ds作为一个系列的函数?
【问题讨论】:
标签:
python
pandas
function
group-by
pandas-groupby
【解决方案1】:
只需使用系列标签索引GroupBy 对象:
def _get_perc(ds):
try:
return ds.value_counts(normalize=True).loc[1]
except KeyError:
return 0.0
df[['group','b']].groupby('group')['b'].apply(_get_perc)
【解决方案2】:
指定要在列b 上显式完成分组。
df
group b
0 1 0
1 1 1
2 2 0
3 2 0
4 2 1
df.groupby('group')['b'].apply(_get_perc)
group
1 0.500000
2 0.333333
Name: b, dtype: float64
不需要预索引步骤。
或者,value_counts也可以直接在Series上调用:
df.groupby('group')['b'].value_counts(normalize=True).xs(1, level=1, axis=0)
group
1 0.500000
2 0.333333
Name: b, dtype: float64
额外的xs 步骤是选择归一化的 1 计数。