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

如何高效遍历大型pandas DataFrame并按多条件更新值?

高效处理大型Pandas DataFrame的条件更新问题

我有一个包含数百万行和多列的大型pandas DataFrame,需要遍历并根据多个条件更新特定值。但使用iterrows()或apply()这类传统方法处理时速度极慢、效率低下,原代码如下:

import pandas as pd

# 假设'df'是包含'A'、'B'、'C'、'D'列的大型DataFrame

# 遍历DataFrame并根据条件更新值
for index, row in df.iterrows():
    if row['A'] > 10 and row['B'] == 'SomeValue':
        df.at[index, 'C'] = row['A'] * 2
    elif row['B'] == 'OtherValue':
        df.at[index, 'D'] = row['C'] + row['D']
    else:
        df.at[index, 'C'] = row['A'] + row['B']

优化方案:使用矢量化操作替代逐行迭代

Pandas的核心优势是矢量化操作,它能利用底层的numpy数组进行批量计算,速度比逐行迭代快几个数量级。针对需求可以用以下几种方式实现:

方法1:使用loc条件索引批量更新

loc可以直接根据布尔条件定位行和列,批量赋值:

import pandas as pd

# 第一个条件:A>10且B='SomeValue',更新C为A*2
mask1 = (df['A'] > 10) & (df['B'] == 'SomeValue')
df.loc[mask1, 'C'] = df.loc[mask1, 'A'] * 2

# 第二个条件:B='OtherValue',更新D为C+D
mask2 = df['B'] == 'OtherValue'
df.loc[mask2, 'D'] = df.loc[mask2, 'C'] + df.loc[mask2, 'D']

# 第三个条件:不满足前两个条件的其他情况,更新C为A+B
mask3 = ~mask1 & ~mask2
df.loc[mask3, 'C'] = df.loc[mask3, 'A'] + df.loc[mask3, 'B']

方法2:使用numpy.where处理多分支条件

numpy.where可以简洁地处理多条件分支,适合逻辑清晰的场景:

import pandas as pd
import numpy as np

# 更新C列:先处理第一个条件,再处理其他情况
df['C'] = np.where(
    (df['A'] > 10) & (df['B'] == 'SomeValue'),
    df['A'] * 2,
    np.where(
        df['B'] != 'OtherValue',  # 排除第二个条件的情况
        df['A'] + df['B'],
        df['C']  # 第二个条件下C保持原值
    )
)

# 更新D列:仅处理B='OtherValue'的情况
df['D'] = np.where(
    df['B'] == 'OtherValue',
    df['C'] + df['D'],
    df['D']
)

矢量化操作更快的原因

  • 逐行迭代(如iterrows())会把每一行转换成Python对象,带来大量额外开销;
  • 矢量化操作直接在底层numpy数组上执行C级别的计算,避免了Python循环的性能损耗;
  • 批量操作能减少内存访问次数,进一步提升效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 21:52:17