You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 06:54:06