Python Pandas按Table字段拆分DataFrame并规避性能警告
DataFrame拆分优化方案(规避性能警告)
问题背景
我是Python新手,目前遇到DataFrame拆分的性能警告问题。现有DataFrame结构如下:
df0 = {'Table':['BKPF','BKPF','BKPF','BSEG','BSEG'], 'Zone':['TCODE', 'BLDAT', 'BLART','HKONT','GSBER'], 'Type':['CHAR','DATE','CHAR','CHAR','CHAR'], 'Len' :[10,8,2,10,4]} df0 = pd.DataFrame(df0)
需要将其拆分为分别对应Table字段值BKPF和BSEG的两个新DataFrame。之前尝试了两种方法,虽能得到结果但出现性能警告,希望解决该问题,后续还要基于拆分后的列从其他DataFrame迁移数据。
此前尝试的两种方法
方法1
df0 = pd.read_csv(Ztable, sep=';') df1 = pd.DataFrame(df0) t_bkpf = df1.loc[df1['Table'] == 'BBKPF'] # 注:此处存在笔误,原数据中值为BKPF而非BBKPF t_bseg = df1.loc[df1['Table'] == 'BBSEG']
方法2
import numpy as np t_bkpf = pd.DataFrame() t_bseg = pd.DataFrame() for index, row in df1.iterrows(): if row['Table'] == 'BKPF': t_bkpf[row['Zone']] = np.nan if row['Table'] == 'BSEG': t_bseg[row['Zone']]= np.nan df_bkpf = t_bkpf.copy() df_bseg = t_bseg.copy()
优化方案(无性能警告)
方案1:按Table分组拆分(高效原生方法)
利用pandas原生优化的groupby方法,一次性完成分组拆分,不会触发性能警告:
# 确保df0为DataFrame结构 df0 = pd.DataFrame(df0) # 按Table字段分组 table_groups = df0.groupby('Table') # 提取目标分组对应的DataFrame t_bkpf = table_groups.get_group('BKPF') t_bseg = table_groups.get_group('BSEG')
方案2:布尔索引优化(修正笔误+避免视图警告)
如果偏好布尔索引方式,需修正笔误并显式复制避免视图引发的警告:
df0 = pd.read_csv(Ztable, sep=';') # 生成布尔掩码 mask_bkpf = df0['Table'] == 'BKPF' mask_bseg = df0['Table'] == 'BSEG' # 显式复制生成独立DataFrame t_bkpf = df0[mask_bkpf].copy() t_bseg = df0[mask_bseg].copy()
方案3:创建空结构DataFrame(适配后续数据迁移需求)
如果你的目标是生成以Zone为列名的空DataFrame(后续用于迁移数据),不要用循环逐列添加,直接提取列名后创建:
# 提取BKPF对应的Zone列名列表 bkpf_cols = df0.loc[df0['Table'] == 'BKPF', 'Zone'].tolist() # 创建空DataFrame t_bkpf = pd.DataFrame(columns=bkpf_cols) # 同理处理BSEG bseg_cols = df0.loc[df0['Table'] == 'BSEG', 'Zone'].tolist() t_bseg = pd.DataFrame(columns=bseg_cols)
性能警告原因说明
- 方法1:未使用
.copy()时提取的是原DataFrame的视图,后续修改可能触发警告;同时存在笔误导致匹配不到数据。 - 方法2:
iterrows()循环逐列添加是低效操作,pandas不推荐用循环处理DataFrame,数据量大时性能极差且会触发警告。
内容的提问来源于stack exchange,提问作者Philippe gauthier
相关产品推荐
相关产品推荐

