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

如何线性拉伸或压缩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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 15:15:03