DataFrame按列名复制列并赋值时遇性能警告问题求助
问题解决:实现DataFrame列复制与值分割,消除PerformanceWarning
原问题分析
你需要处理一个包含重复列名的DataFrame:
- 列名含
Tridem:复制2次,所有该类列的值除以3 - 列名含
Tandem:复制1次,所有该类列的值除以2 - 原代码未实现列复制需求,且因重复列名触发性能警告
原DataFrame结构:
Single Tridem Tandem Tridem 0 700 1500 1200 2700
警告原因
PerformanceWarning是因为DataFrame存在重复列名(两个Tridem列),直接用列名索引时,pandas需要在重复列中匹配查找,超出默认排序深度导致性能提示。
正确实现方案(推荐)
通过构建新列列表的方式,给复制的列添加唯一后缀,避免重复列名,同时完整实现需求:
import pandas as pd # 构造原DataFrame weight = [700, 1500, 1200, 2700] name = ['Single', 'Tridem', 'Tandem', 'Tridem'] ol_axle = pd.DataFrame([weight], columns=[name]) # 初始化存储处理后列的列表 new_columns = [] for col_name in ol_axle.columns: col_data = ol_axle[col_name] if 'Tridem' in col_name: divided_val = col_data / 3 # 添加3个带后缀的列(原列+2个复制列) new_columns.extend([ (f"{col_name}_1", divided_val), (f"{col_name}_2", divided_val), (f"{col_name}_3", divided_val) ]) elif 'Tandem' in col_name: divided_val = col_data / 2 # 添加2个带后缀的列(原列+1个复制列) new_columns.extend([ (f"{col_name}_1", divided_val), (f"{col_name}_2", divided_val) ]) else: # Single列直接保留 new_columns.append((col_name, col_data)) # 生成最终DataFrame result_df = pd.DataFrame({name: data for name, data in new_columns}) print(result_df)
执行后输出:
Single Tridem_1 Tridem_2 Tridem_3 Tandem_1 Tandem_2 Tridem_1 Tridem_2 Tridem_3 0 700 500.0 500.0 500.0 600.0 600.0 900.0 900.0 900.0
保留原列名的替代方案(不推荐)
如果必须保留重复列名,可通过位置索引(iloc)避免警告,但后续操作仍可能因重复列名出现问题:
import pandas as pd weight = [700, 1500, 1200, 2700] name = ['Single', 'Tridem', 'Tandem', 'Tridem'] ol_axle = pd.DataFrame([weight], columns=[name]) # 反向遍历列索引,避免插入列导致索引偏移 for idx in reversed(range(len(ol_axle.columns))): col_name = ol_axle.columns[idx] col_data = ol_axle.iloc[:, idx] if 'Tridem' in col_name: # 修改原列值 ol_axle.iloc[:, idx] = col_data / 3 # 插入2个复制列 ol_axle.insert(idx+1, col_name, col_data / 3) ol_axle.insert(idx+2, col_name, col_data / 3) elif 'Tandem' in col_name: ol_axle.iloc[:, idx] = col_data / 2 ol_axle.insert(idx+1, col_name, col_data / 2) print(ol_axle)
原代码问题说明
- 使用
tridem_divided/tandem_divided标志导致仅处理第一个匹配列,忽略了第二个Tridem列 - 未实现列复制需求,仅修改了列值,与需求不符
- 直接用重复列名索引触发性能警告
内容的提问来源于stack exchange,提问作者ar ia
相关产品推荐
相关产品推荐

