熊猫:灵活聚合级别的最佳习语

时间:2015-04-27 14:07:40

标签: python pandas

我希望计算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()会应用于所有列,这可能会影响到中到大型数据集。

1 个答案:

答案 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()) ,
    })

通过这种方式,首先选择系列,然后根据所需的操作求和或求平均值。感谢您推荐我发布此答案。