Pandas内存高效迭代更新DataFrame的需求及问题解决
优化Pandas代码内存效率并实现指定迭代更新需求
原代码
import pandas as pd # Sample DataFrame data = {'A': [1, 2, 3], 'B': [4, 5, 6], 'ST_GR': [1, 2, 3], 'SEC': [1, 2, 4]} df = pd.DataFrame(data) GROUP = ['SEC', 'ST_GR'] VALUES = [['Z', 'ZZ'], ['Z', 'ST_GR'], ['SEC', 'Z'], ['SEC', 'ST_GR']] # Create a dictionary to store the updates updates = {} # Iterate through GROUP and VALUES for group_item, sub_value in zip(GROUP, VALUES): if group_item in df.columns: for value in range(len(sub_value)): updates[group_item] = sub_value[value] print(updates) # Update the DataFrame with the specified values df.update(pd.DataFrame(updates, index=df.index)) print("Updated DataFrame:") print(df)
需求说明
每次迭代需按以下规则更新原DataFrame:
- 第1次迭代:设置
df['SEC'] = 'Z',df['ST_GR'] = 'ZZ' - 第2次迭代:设置
df['SEC'] = 'Z',df['ST_GR']保留原始值 - 第3次迭代:
df['SEC']保留原始值,设置df['ST_GR'] = 'Z' - 第4次迭代:
df['SEC']与df['ST_GR']均保留原始值
每次迭代预期输出
第1次迭代
A B ST_GR SEC 0 1 4 Z ZZ 1 2 5 Z ZZ 2 3 6 Z ZZ
第2次迭代
A B ST_GR SEC 0 1 4 1 Z 1 2 5 2 Z 2 3 6 3 Z
第3次迭代
A B ST_GR SEC 0 1 4 Z 1 1 2 5 Z 2 2 3 6 Z 4
第4次迭代
A B ST_GR SEC 0 1 4 1 1 1 2 5 2 2 2 3 6 3 4
优化后的解决方案
核心思路:提前备份原始列数据,每次迭代先恢复原始状态,再直接在原DataFrame上执行指定更新,全程仅使用单个DataFrame和必要备份变量,最大化内存效率。
import pandas as pd # 初始化原始DataFrame data = {'A': [1, 2, 3], 'B': [4, 5, 6], 'ST_GR': [1, 2, 3], 'SEC': [1, 2, 4]} df = pd.DataFrame(data) # 备份原始列数据,用于每次迭代前恢复初始状态 original_sec = df['SEC'].copy() original_st_gr = df['ST_GR'].copy() # 定义每次迭代的更新规则 update_rules = [ {'SEC': 'Z', 'ST_GR': 'ZZ'}, # 第1次迭代 {'SEC': 'Z'}, # 第2次迭代 {'ST_GR': 'Z'}, # 第3次迭代 {} # 第4次迭代:无更新 ] # 执行迭代更新 for idx, rule in enumerate(update_rules, 1): # 恢复原始值 df['SEC'] = original_sec df['ST_GR'] = original_st_gr # 应用当前迭代的更新规则 df.update(pd.DataFrame(rule, index=df.index)) # 打印结果 print(f"第{idx}次迭代:") print(df) print("-" * 20)
代码说明
- 提前备份原始列,避免迭代过程中原始数据被覆盖,确保每次更新都从初始状态开始
- 直接操作原DataFrame,无多余中间对象生成,内存占用极低
- 用
update()方法批量更新指定列,逻辑清晰且高效
内容的提问来源于stack exchange,提问作者Gaurav
相关产品推荐
相关产品推荐

