为groupby列编写自定义函数

时间:2018-10-09 23:40:09

标签: python pandas function group-by pandas-groupby

尝试编写以下自定义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作为系列的函数?

2 个答案:

答案 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)