首页 > 解决方案 > 如何使用用户定义的函数执行 groupy by?

问题描述

所以我有两个数据框,一个是包含许多列的完整数据集,每一行都是一个观察值。

第二个数据框是第一个数据框的子集,但通过名为“县”的变量计算列中缺失值的百分比。

到目前为止,我有一个函数可以提供预期的结果并为整个列提供缺失的 %:

def missing_count(df, var):
    percent_missing= df[var].isnull().sum() * 100 / len(df)
    return round(percent_missing,2)

但我想做的是使其特定于一个县。例如 - 病例数在 y 县缺失 12%,在 x 县缺失 15%。该代码目前只是说明整个数据框中缺少多少个案例编号。假设整个数据框中有 66 个独特的县,我正在寻找 66 个单独的缺失计数。

我正在尝试使用 groupby 来获得结果,但它不起作用。

df2['casenumber'] = df.groupby(by='county').apply(missing_count(df, 'casenumber'))

但这不起作用,我得到“TypeError:'numpy.float64'对象不可调用”。

我究竟做错了什么?

标签: pythonpandasdataframe

解决方案


您应该重写您的函数,以便它采用系列或关键字变量val

# series:
def missing_count(s, var):
    percent_missing= s.isnull().sum() * 100 / s
    return round(percent_missing,2)

df.groupby('county')['casenumber'].apply(missing_count)


# or keyword `val`
# careful for `KeyError`
def missing_count(d, var=None)
    percent_missing= df[var].isnull().sum() * 100 / len(df)
    return round(percent_missing,2)

df.groupby('county').apply(missing_count, var='casenumber')

也就是说,您的代码可以编写如下,它应该会更高效:

df['case_number'].isnull().groupby(df['county']).mean()

推荐阅读