如何在Pandas DataFrame中比较两列并高效修改列值及分组求和?
问题解决
一、你的循环代码无法运行的原因
- 语法错误:
if row["period"] < row["update"]这行末尾缺少冒号:,Python条件语句必须以冒号结尾。 - 数据修改无效:
iterrows()返回的row是原DataFrame的副本,直接修改row["amount"]不会同步到原表格中,就算修正语法,也得改成table.loc[index, "amount"] = 0才能生效,但这种循环方式对6万行数据来说效率极低。
二、高效处理方案(适配大数据量)
Pandas的核心优势是矢量化操作,完全不需要写循环,用内置方法就能快速完成,两种思路任选:
思路1:先筛选符合条件的行再分组求和
直接过滤出period大于等于update的行,再按project和category分组汇总金额:
# 筛选符合条件的行,分组求和后重置索引 result = table[table["period"] >= table["update"]].groupby(["project", "category"])["amount"].sum().reset_index()
思路2:先标记无效金额为0再分组求和
把period < update的行的amount设为0,再进行分组汇总,适合需要保留原表格其他数据的场景:
# 用where方法,满足条件保留原amount,否则设为0 table["amount"] = table["amount"].where(table["period"] >= table["update"], 0) # 分组求和 result = table.groupby(["project", "category"])["amount"].sum().reset_index()
这两种方法都是基于Pandas底层的矢量化计算,处理6万行数据基本瞬间完成,比循环效率高几十倍甚至上百倍。
内容的提问来源于stack exchange,提问作者LadisPavel
相关产品推荐
相关产品推荐

