Pandas DataFrame循环替代方案:植物学数据清洗与转置优化
优化方案:用map/reduce替代for循环实现可复用的植物学DataFrame统计函数
核心思路
结合pandas分组能力与map/reduce,把原for循环的重复逻辑抽象成通用函数,同时兼容列名变更、分组列与聚合列间存在其他列的场景。
优化后的代码
import pandas as pd from functools import reduce def stat_pl_optimized(df, group_col="Transect", agg_col="Exigence"): # 自动筛选需聚合的数值列(排除非数值列及聚合列本身) numeric_cols = list(filter( lambda col: df[col].dtype in ['int64', 'float64'] and col != agg_col, df.columns )) # 批量处理每个分组:聚合求和→转置→添加分组标识 processed_groups = list(map( lambda group: group[1].groupby(agg_col)[numeric_cols].sum().T .rename_axis(index=None) .assign(**{group_col: group[0]}), df.groupby(group_col) )) # 合并所有分组结果 return reduce(lambda df1, df2: pd.concat([df1, df2], ignore_index=True), processed_groups) # 使用示例 # 读取Excel数据 df = pd.read_excel("植物学数据.xlsx") # 自定义列名调用(示例:更换分组列和聚合列) result = stat_pl_optimized(df, group_col="样带编号", agg_col="需求等级") print(result)
代码说明
- 数值列自动筛选:用
filter+lambda快速定位需聚合的数值列,无需手动指定列名,自动适配中间列存在的场景。 - 分组批量处理:用
map遍历所有分组,一次性完成聚合、转置、添加分组标识操作,替代原for循环的重复代码。 - 结果合并:用
reduce拼接所有分组的处理结果,逻辑更简洁,效率优于循环append。
适配场景
- 列名变更:调用函数时传入新的
group_col和agg_col参数即可,无需修改核心逻辑。 - 多中间列:自动过滤非数值列,不管分组列与聚合列之间有多少其他列,都不影响统计逻辑。
内容的提问来源于stack exchange,提问作者ml_cen
相关产品推荐
相关产品推荐

