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

单列CSV按固定空格拆分多列构建数据集的技术问询

我明白你的问题了——你的CSV是单列格式,用固定数量空格分隔,但第三列(c3)偶尔会带个空格,直接用简单的空格拆分肯定会把列拆乱。你之前的代码只取了首尾元素,根本没法得到中间的结构化数据,我给你几个实用的解决方案:

方法1:用正则表达式精确提取每一列(推荐,适配c3含空格的场景)

正则表达式能精准匹配每一列的格式,不管c3有没有空格都能正确捕获。假设你的数据结构是:日期 数字c1 数字c2 可能含空格的c3 带逗号的数字c4 带逗号的数字c5...,可以用str.extract()来提取:

import pandas as pd

# 读取单列CSV,假设没有表头,自定义列名为'data'
df = pd.read_csv('your_file.csv', header=None, names=['data'])

# 定义正则表达式,每个括号对应一列,可根据实际格式调整
pattern = r'^(\d{2}/\d{2}/\d{2}) (\d+) (\d+) ([\w\s]+) ([\d,]+) ([\d,]+)'
# 提取列并转为DataFrame
extracted_df = df['data'].str.extract(pattern, expand=True)
# 给列命名
extracted_df.columns = ['date', 'c1', 'c2', 'c3', 'c4', 'c5']

# 如果有更多后续列,只需扩展正则表达式的捕获组即可

这里([\w\s]+)专门用来匹配c3,允许字母、数字和空格;[\d,]+则匹配带逗号的数值(比如样例里的4,7)。

方法2:拆分后合并指定列(适合明确c3位置的情况)

如果确定c3是从第4个元素开始,到倒数第n个元素结束,可以先按任意连续空格拆分(避免连续空格产生空元素),再合并对应部分:

import pandas as pd

df = pd.read_csv('your_file.csv', header=None, names=['data'])

# 按任意连续空格拆分,得到每行的元素矩阵
split_data = df['data'].str.split('\s+', expand=True)

# 提取固定位置的列
df['date'] = split_data[0]
df['c1'] = split_data[1]
df['c2'] = split_data[2]
# 合并第3列到倒数第2列作为c3(假设最后两列是c4、c5)
df['c3'] = split_data.loc[:, 3:-2].apply(' '.join, axis=1)
df['c4'] = split_data[split_data.columns[-2]]
df['c5'] = split_data[split_data.columns[-1]]

# 移除原始的单列数据
df = df.drop('data', axis=1)

方法3:读取CSV时直接指定分隔符(仅适合c3不含空格的场景)

如果你的c3大部分时候不带空格,或者可以先手动处理少数带空格的行,那么读取CSV时直接用多个空格作为分隔符是最省事的:

import pandas as pd

# sep='\s+'表示用任意连续空格作为分隔符,header=None表示无表头
df = pd.read_csv('your_file.csv', sep='\s+', header=None)
# 给列命名
df.columns = ['date', 'c1', 'c2', 'c3', 'c4', 'c5']

但要注意:如果c3含空格,这个方法会把c3拆成两列,导致列数混乱,所以只适合c3无空格的场景。

内容的提问来源于stack exchange,提问作者Khaled Koubaa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:28:51