使用Pandas定义自定义GroupBy聚合函数会导致AttributeError



我有一个Pandas数据帧-

data = {'year':[1990, 1990, 1990, 
1990, 1990, 1990, 
1990, 1990, 1990], 
'zip':['22204', '22204', '22204',
'20194', '20194', '20194', 
'24060', '24060', '24060'],
'education':[0, 0, 1,
1, 0, 1, 
0, 1, 0]}
df = pd.DataFrame(data = data)

我想使用分组函数-计算教育变量education中每个结果的百分比

df = df.groupby(['zip', 'year'])['education'].value_counts(normalize = True, dropna = False).unstack().fillna(0)

但是,我想调用自定义聚合函数中的代码行。当我运行下面的代码行时,我得到了这个错误消息-AttributeError: 'Float64Index' object has no attribute 'remove_unused_levels'

def percent_by_category(group):
return group.value_counts(normalize = True, dropna = False).unstack().fillna(0)
df = df.groupby(['zip', 'year']).agg({'education':percent_by_category})

是否可以创建一个自定义聚合函数,逐组计算每个结果的百分比?理想情况下,我想调用其他几个内置的自定义聚合函数。例如

df = df.groupby(['zip', 'year']).agg({'education':percent_by_category,
'education':sum, 
'education':another_custom_function, 
another_variable:another_custom_function})

否,如果使用agg函数,则聚合函数的标量输出是必需的。

如果测试如何工作.value_counts(),有系列,所以不可能unstack他们。

def percent_by_category(group):
print (group.value_counts(normalize = True, dropna = False))
df = df.groupby(['zip', 'year']).agg({'education':percent_by_category})
print (df)
1    0.666667
0    0.333333
Name: education, dtype: float64
0    0.666667
1    0.333333
Name: education, dtype: float64
0    0.666667
1    0.333333
Name: education, dtype: float64
education
zip   year          
20194 1990      None
22204 1990      None
24060 1990      None

因此,如果要返回非标量输出,则会引发错误:

def percent_by_category(group):
return group.value_counts(normalize = True, dropna = False)
df = df.groupby(['zip', 'year']).agg({'education':percent_by_category})
print (df)

ValueError:函数不会减少

最新更新