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

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)

原代码问题说明

  1. 使用tridem_divided/tandem_divided标志导致仅处理第一个匹配列,忽略了第二个Tridem列
  2. 未实现列复制需求,仅修改了列值,与需求不符
  3. 直接用重复列名索引触发性能警告

内容的提问来源于stack exchange,提问作者ar ia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 03:35:00