pandas DataFrame按条件计算均值求和并写入CSV的问题及优化
现有代码问题
逻辑错误
- 列名不匹配:代码中使用的
textfield1/textfield2/textfield3与数据集实际列名text1/text2/text3不一致,筛选条件全不满足,所以计算结果多为nan或0。 - 筛选规则错误:计算均值、求和时的条件
df['textfield3'] == 'text3'是匹配字段值为字符串"text3"的行,而非筛选指定的text3取值,且完全没有关联当前循环的x、y坐标,所有坐标的计算结果完全重复且无效。 - 变量与写入逻辑错误:循环中定义的行列表是
rows_list,实际追加用了未定义的rows_list_c;写入CSV时遍历的是单个字典dict_out而非行列表,导致输出内容完全不符合预期,text3字段为空。 - 坐标计算错误:输出x、y时额外减去了
x_inc/y_inc,输出坐标与原始网格坐标不匹配。
性能问题
- 多层嵌套循环完全没有利用pandas向量化计算能力,大数据量下运行效率极低,且循环内重复对全量df做筛选,产生大量冗余计算。
优化方案
直接使用pandas内置的分组聚合能力,完全替代嵌套循环,性能可以提升几个数量级,示例代码如下:
import pandas as pd import numpy as np # 第一步:先全局筛选指定的text3值,替换为你实际需要的筛选值 target_text3 = "ii" filtered = data[data["text3"] == target_text3] # 第二步:按text1、text2、x、y分组,一次完成均值、求和计算 # 如果需要只保留text_list1、text_list2范围内的组合,可先加筛选条件: # filtered = filtered[filtered["text1"].isin(text_list1) & filtered["text2"].isin(text_list2)] result = filtered.groupby( ["text1", "text2", "x", "y"], as_index=False ).agg( ave=("float1", "mean"), sum_val=("float2", "sum") ) # 第三步:按text1、text2分组分别写入CSV for (text1, text2), group_df in result.groupby(["text1", "text2"]): filename = f"{text1}_{text2}_Values.csv" # 如果需要补全所有网格点的空值,可以取消注释下方代码,生成全量x、y网格再左连接 # min_x, max_x = group_df["x"].min(), group_df["x"].max() # min_y, max_y = group_df["y"].min(), group_df["y"].max() # full_grid = pd.MultiIndex.from_product( # [np.arange(min_x, max_x+x_inc, x_inc), np.arange(min_y, max_y+y_inc, y_inc)], # names=["x", "y"] # ).to_frame(index=False) # group_df = full_grid.merge(group_df, on=["x", "y"], how="left").fillna({"ave":0, "sum_val":0}) group_df.to_csv(filename, index=False, columns=["text1", "text2", "x", "y", "ave", "sum_val"])
如果需要保留text3字段,直接在groupby的参数里加上text3即可。
内容的提问来源于stack exchange,提问作者MicrobicTiger
相关产品推荐
相关产品推荐

