尝试编写以下自定义groupby函数以计算给定二进制列b中1s的百分比:
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)
但是熊猫把ds作为数据框而不是Series。它给我一个 AttributeError:“ DataFrame”对象没有属性“ value_counts”。
我应该如何编写将ds作为系列的函数?
答案 0 :(得分:3)
指定要在列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
步骤是选择标准化计数1s。
答案 1 :(得分: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)