本文介绍一种高效、无警告的 pandas 方法:依据列名(如 'tridem' 重复3次、'tandem' 重复2次)动态扩展 dataframe 列,并将原值等比例分配到所有副本中,彻底规避 `performancewarning: indexing past lexsort depth`。
在处理轴载配置(如单轴、双联轴、三联轴)类工程数据时,常需按物理规则对列进行“展开”:例如 'Tridem' 表示三联轴,需将该列复制 3 份且每份取原值的 1/3;'Tandem' 表示双联轴,需复制 2 份且每份为原值的 1/2;而 'Single' 保持不变(复制 1 次)。原始代码使用循环 + 原地赋值的方式,不仅逻辑易错,更会触发 Pandas 的 PerformanceWarning——这是因为反复对未排序索引的 DataFrame 进行列级赋值,破坏了底层索引的 lexsort 状态,影响后续向量化操作性能。
推荐采用向量化、一次性构造方案,完全避免循环和就地修改。核心思路分三步:
以下是完整可运行代码:
import pandas as pd
import numpy as np
# 构造原始 DataFrame(注意:修正原问题中 columns=[name] 的错误写法)
weight = [700, 1500, 1200, 2700]
name = ['Single', 'Tridem', 'Tandem', 'Tridem']
ol_axle = pd.DataFrame([weight], columns=name) # ✅ 正确:columns=name,非 [name]
# 定义重复规则:列名 → 复制次数
n_map = {'Single': 1, 'Tandem': 2, 'Tridem': 3}
# 步骤1:获取每列对应重复次数(Series,长度=原列数)
rep_series = ol_axle.columns.map(n_map)
# 步骤2:对原 DataFrame 按列广播除法(axis=1 确保按列除)
divided_df = ol_axle.div(rep_series, axis=1)
# 步骤3:使用 np.repeat 扩展列(数据 + 列名同步重复)
expanded_data = np.repeat(divided_df.values, rep_series, axis=1)
expanded_columns = np.repeat(ol_axle.columns, rep_series)
# 构造最终 DataFrame
result = pd.DataFrame(expanded_data,
columns=expanded_columns,
index=ol_axle.index)
print(result)输出结果:
Single Tridem Tridem Tridem Tandem Tandem Tridem Tridem Tridem 0 700.0 500.0 500.0 500.0 600.0 600.0 900.0 900.0 900.0
✅ 优势总结:
⚠️ 注意事
项:
此方案兼顾简洁性、可读性与工业级鲁棒性,是处理此类“语义化列展开”任务的标准实践。