如何高效遍历大型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
相关产品推荐
相关产品推荐

