Pandas与numpy中的groupby

如题所述

Pandas的groupby功能,是基于数据分组和计算的强大工具,它遵循着经典的split-apply-combine原则。让我们一步步探索其使用方法和优化策略。


首先,通过DataFrame.groupby('字段'),我们创建一个分组,返回一个DataFrameGroupBy对象,这个对象是一个迭代器,允许我们通过for循环或list()方法逐个查看每个分组。在进行计算时,诸如筛选(df[df['B'] > 30].groupby('A')['B'].sum())或求和(df.groupby('A')['B'].sum())这样的操作是常见的。


区分filter和transform的关键在于,前者需要聚合函数,而后者则针对单列操作。尽管groupby在大数据集上表现出色,但在处理单个元素时,切片操作可能会增加时间消耗,这时直接将结果转为DataFrame会更有助于理解,具体步骤可通过相关知乎文章学习。


在处理空值方面,直接使用sum会忽略它们,而apply则不然。如果你需要保留空值,可以使用sum(skipna=True)。常见的聚合操作包括单列或多列的统计,如count、mean、max和min,以及对列进行组合后进行聚合,如groupby_str()函数。


构建agg_dict时,列名应以列表形式提供,以避免复合索引带来的潜在问题。例如,要分组的字段可以是conditions = ['频段', '带宽', '测试场景'],而目标列target_col = ["电平", "天线数"]则对应不同的聚合函数,如agg_dict={"电平": ["mean", "std"], "天线数": ["sum", "count"]}。


对于更复杂的操作,可以借助pandas和DuckDB的结合。例如,df_groupby函数通过groupby、重命名列并利用DuckDB的高性能,如条件df = df.groupby(conditions).agg(agg_dict).reset_index().set_index(['-'.join(x) if '' not in x else x[0] for x in df.columns])。


另一方面,numpy的groupby则通过先移动指定列,然后进行分组并返回字典形式的结果。在Python中,通过优化的函数API和DuckDB的UDF(用户定义函数)可以进一步提升性能。比如:



    Python函数API的优化:从最初的耗时14.8s,经过版本二的优化,可以减少到5.6s,再到并行执行的2.1s,非DataFrame转换甚至只需要1.81s。
    DuckDB实现的极致效率:版本六直接处理表,耗时仅为131 µs,显示出DuckDB在处理大数据时的卓越性能。

总的来说,Pandas的groupby功能强大且灵活,配合适当的优化,可以高效处理大量数据。从版本一到版本六的对比,展示了如何逐步提升代码效率,最大化利用数据处理工具的优势。

温馨提示:答案为网友推荐,仅供参考
相似回答