我希望计算DataFrame
上的一些汇总统计信息,我可以使用任何一组分类列进行汇总,包括空集 - 即使根本没有聚合。我强调第二个原因,因为至少在我熟悉的API部分中,聚合或不聚合的选择似乎导致了不同的方法集。
这是我的代码:
n = 20
df = DataFrame ({
"Region" : np.random.choice (['North','South'], size=n) ,
"Category" : np.random.choice (['cat1','cat2'], size=n) ,
"id" : [i for i in range (1,n+1)] ,
"val_1" : np.random.randn(n) ,
"val_2" : [i for i in range (1,n+1)]
})
def agg_routine (dataframe, var_names_cat):
if (var_names_cat is not None):
# Will fail if var_names_cat is None
grouped = dataframe.groupby(var_names_cat)
return grouped.agg ({
"val_1" : np.sum ,
"val_2" : np.average
})
else:
return DataFrame ({
"val_1" : Series (np.sum (dataframe["val_1"])) ,
"val_2" : Series (np.average (dataframe["val_2"]))
})
print (agg_routine(df, ["Region"]))
print (agg_routine(df, ["Region","Category"]))
print (agg_routine(df, None))
所有这一切都运行正常,但您可以看到agg_routine()
中发生了什么 - 根据我是否聚合,有两种截然不同的代码路径。
我的问题:在不必拥有if
分支和两个代码路径的情况下,执行我正在做的事情的最佳,最正确的方法是什么 - 一些方法集哪个可以使用分组和未分组的数据?
我只是想避免在两条路径上重复计算,因为这很容易导致错误。
我接近以下内容:
def agg_routine (dataframe, var_names_cat):
if (var_names_cat is not None):
data_temp = dataframe.groupby(var_names_cat)
else:
data_temp = dataframe
return DataFrame ({
"val_1" : Series (data_temp.sum()["val_1"]) ,
"val_2" : Series (data_temp.mean()["val_2"]) ,
})
但是,这里的问题是sum()
和mean()
会应用于所有列,这可能会影响到中到大型数据集。
答案 0 :(得分:1)
如果修改agg_routine,则应该得到相同的结果,而不会产生多列操作开销,如下所示:
def agg_routine (dataframe, var_names_cat):
if (var_names_cat is not None):
data_temp = dataframe.groupby(var_names_cat)
else:
data_temp = dataframe
return DataFrame ({
"val_1" : Series (data_temp["val_1"].sum()) ,
"val_2" : Series (data_temp["val_2"].mean()) ,
})
通过这种方式,首先选择系列,然后根据所需的操作求和或求平均值。感谢您推荐我发布此答案。