如何线性拉伸或压缩pandas DataFrame列以统一各列长度
实现方案
核心思路是对每列做一维线性重采样:把原序列的横坐标归一化到[0,1]区间后,映射到目标长度对应的横坐标上,通过线性插值得到拉伸/压缩后的序列,不需要在末尾补值,也不会破坏序列的整体线性趋势。
步骤1:批量导入CSV并计算目标长度
首先读取所有CSV文件,提取需要处理的列,再以所有列的平均长度取整作为统一的目标长度:
import pandas as pd import numpy as np import os # 替换为你的CSV文件存储目录 csv_dir = "./csv_files" raw_columns = [] # 批量读取CSV for file in os.listdir(csv_dir): if not file.endswith(".csv"): continue df = pd.read_csv(os.path.join(csv_dir, file)) # 假设每个CSV的第一列为待处理序列,自动去除空值 col_data = df.iloc[:, 0].dropna().values raw_columns.append((file, col_data)) # 计算平均长度作为目标长度,可根据需求调整取整规则 all_lengths = [len(col) for _, col in raw_columns] target_length = int(round(np.mean(all_lengths)))
步骤2:定义线性重采样函数
该函数会自动适配长度大于/小于目标长度的序列,分别做压缩/拉伸处理:
def linear_resample(col_data, target_len): origin_len = len(col_data) # 长度匹配直接返回 if origin_len == target_len: return col_data # 归一化原坐标和目标坐标 x_origin = np.linspace(0, 1, origin_len) x_target = np.linspace(0, 1, target_len) # 线性插值得到重采样结果 return np.interp(x_target, x_origin, col_data)
步骤3:批量处理所有列并合并为DataFrame
resampled_data = {} for filename, col in raw_columns: # 去掉csv后缀作为列名,可自定义规则 col_name = os.path.splitext(filename)[0] resampled_data[col_name] = linear_resample(col, target_length) final_df = pd.DataFrame(resampled_data)
注意事项
- 本方案仅适用于数值型序列,如果你的数据包含非数值类型,可将
np.interp替换为临近值插值、分类值映射等适配逻辑 - 对平滑性要求更高的场景,可以引入scipy的插值工具实现二次、三次样条插值替代线性插值
- 如果是单个CSV导入后多列存在大量空值导致长度不一,可先提取每列的非空值序列再执行上述重采样逻辑
内容的提问来源于stack exchange,提问作者Omer Davidi
相关产品推荐
相关产品推荐

