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

Pandas遍历DataFrame按条件应用函数:行重复问题排查及优化咨询

问题排查与优化:Pandas行处理重复问题

问题背景

给定如下Pandas DataFrame:

import pandas as pd
import numpy as np
data = [(3,5,7), (2,4,6),(5,8,9)]
df = pd.DataFrame(data, columns = ['A','B','C'])

需求:遍历每行并检查C列值是否大于8:

  • 若C列值小于8,将该行追加至df2;
  • 若C列值大于8,调用increase_value函数处理后追加至df2:
def increase_value(max_value):
     max_value= max(df['B'])
     df['C'] = df['C'] + max_value
     return df

自行编写的check_value函数实现逻辑:

def check_value(df):
    df2 = pd.DataFrame(columns=df.columns)
    for index, row in df.iterrows():
        if row['C'] < 8:
            df2 = df2.append(row)
        else:
            max_b_value = max(df['B'])
            row = increase_value(max_b_value)
            df2 = df2.append(row)
    return df2
df2 = check_value(df)

运行后出现行重复问题,未达到预期效果。要求必须使用上述两个函数,排查错误原因,同时确认当前提取行的方式是否最优。预期输出:

----------------
| A |  B | C   |
| 3 |  5 | 7   |  
| 2 |  4 | 6   |
| 5 |  8 | 17  |
----------------

错误原因分析

  1. increase_value的副作用:该函数直接修改原DataFramedf的C列,且返回整个df而非单独处理当前行。当循环到第三行(C=9>8)时,调用increase_value会把原df所有行的C列都加上max(B)=8,此时原df所有行的C值都被修改,再把整个df追加到df2,就会重复添加之前已经加入的两行,导致行重复。
  2. 循环逻辑错误:需求是仅处理当前符合条件的行,但increase_value的设计是修改整个df,和需求的“单行处理”不匹配,进而导致追加整个df时引入多余行。

修正后的代码

要保留指定的两个函数,需调整check_value逻辑,避免修改原df,同时只追加目标行:

import pandas as pd
import numpy as np

data = [(3,5,7), (2,4,6),(5,8,9)]
df = pd.DataFrame(data, columns = ['A','B','C'])

def increase_value(max_value):
     max_value= max(df['B'])
     # 创建原df的副本,避免修改原数据
     temp_df = df.copy()
     temp_df['C'] = temp_df['C'] + max_value
     return temp_df

def check_value(df):
    df2 = pd.DataFrame(columns=df.columns)
    max_b = max(df['B'])
    # 先获取处理后的完整df,仅用于提取目标行
    processed_df = increase_value(max_b)
    
    for index, row in df.iterrows():
        if row['C'] < 8:
            df2 = df2.append(row)
        else:
            # 从处理后的df中提取当前行追加
            df2 = df2.append(processed_df.loc[index])
    return df2

df2 = check_value(df)
print(df2.reset_index(drop=True))

运行后输出符合预期:

A  B   C
0  3  5   7
1  2  4   6
2  5  8  17

提取行方式的优化建议

当前用iterrows()遍历+append的方式不是最优:

  • iterrows()返回Series对象,遍历效率低,数据量大时更明显;
  • df.append()每次都会创建新DataFrame,频繁调用会带来性能损耗。

优化方案(仍保留指定函数):

def check_value(df):
    max_b = max(df['B'])
    processed_df = increase_value(max_b)
    # 用布尔索引拆分条件,直接合并结果
    mask = df['C'] < 8
    df2 = pd.concat([df[mask], processed_df[~mask]], ignore_index=True)
    return df2

这种方式利用Pandas向量化操作和concat,避免循环与频繁append,效率更高,代码更简洁。


内容的提问来源于stack exchange,提问作者user3619789

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 15:15:13