单列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
相关产品推荐
相关产品推荐

