如何循环遍历DataFrame列实现基线校正?
解决DataFrame全列基线校正的循环报错问题
错误原因分析
- 第一次循环错误:
for i in df迭代的是DataFrame的列名字符串,而非列的数值数据。将列名传入adaptive_minmax后,函数会将字符串视为长度为1的序列,与长度为1433的x索引不匹配,从而触发length mismatch和维度错误。 - 第二次循环错误:嵌套循环遍历了列中的单个数值,把标量传给
Baseline和adaptive_minmax,完全不符合函数对一维数组的输入要求,导致矩阵分解时出现SVD did not converge错误。
正确实现方式
方法1:手动循环(直观易调试)
import pandas as pd from baseline import Baseline import matplotlib.pyplot as plt df = pd.read_csv('datatest.csv') # 全局初始化Baseline,x用DataFrame的索引,无需重复创建 x = df.index baseline_filter = Baseline(x_data=x) # 新建DataFrame存储校正后的数据 corrected_df = pd.DataFrame(index=df.index) # 遍历所有列名,获取对应列的数据进行校正 for col_name in df.columns: y = df[col_name] # 执行基线校正 corrected_data = baseline_filter.adaptive_minmax( y, poly_order=None, method='modpoly', weights=None, constrained_fraction=0.001, constrained_weight=100000.0, estimation_poly_order=2, method_kwargs=None )[0] # 存入结果DataFrame corrected_df[col_name] = corrected_data # 可选:绘制单列校正对比图 plt.figure() plt.plot(y, label='原始数据') plt.plot(corrected_data, label='校正后数据') plt.title(f'列 {col_name} 基线校正结果') plt.legend() plt.show()
方法2:Pandas Apply(简洁高效)
利用Pandas的apply函数批量处理列,代码更简洁:
import pandas as pd from baseline import Baseline import matplotlib.pyplot as plt df = pd.read_csv('datatest.csv') x = df.index baseline_filter = Baseline(x_data=x) # 定义基线校正函数 def correct_single_column(column): return baseline_filter.adaptive_minmax( column, poly_order=None, method='modpoly', weights=None, constrained_fraction=0.001, constrained_weight=100000.0, estimation_poly_order=2, method_kwargs=None )[0] # 对所有列应用校正 corrected_df = df.apply(correct_single_column, axis=0) # 可选:批量绘制校正对比图 for col_name in df.columns: plt.figure() plt.plot(df[col_name], label='原始数据') plt.plot(corrected_df[col_name], label='校正后数据') plt.title(f'列 {col_name} 基线校正结果') plt.legend() plt.show()
关键注意事项
- 避免重复初始化
Baseline:x_data是固定的索引值,只需初始化一次即可,减少不必要的开销。 - 确保输入为一维数组:
df[col_name]返回的是Pandas Series,符合adaptive_minmax对一维输入的要求。 - 保留原始数据:将校正结果存入新的DataFrame,避免覆盖原始数据,方便后续对比验证。
内容的提问来源于stack exchange,提问作者TCC
相关产品推荐
相关产品推荐

