从列表创建Pandas DataFrame仅返回1列,如何拆分出4列?
问题描述
我的input.txt内容如下:
040525 $$$$$ 9999 12345 040525 $$$$$ 8888 12345 040525 $$$$$ 7777 12345 040525 $$$$$ 6666 12345
因为预处理限制,没法直接用pd.read_csv,只能先把文件内容读成列表再转DataFrame,代码如下:
data_list = [] with open('input.txt', 'r') as data: for line in data: data_list.append(line.strip()) df = pd.DataFrame(data_list)
但这样每行都被识别成单独一列,输出结果如下:
print(df.shape) print(df) print(df.columns.tolist()) # 输出: (4, 1) 0 0 040525 $$$$$ 9999 12345 1 040525 $$$$$ 8888 12345 2 040525 $$$$$ 7777 12345 3 040525 $$$$$ 6666 12345 [0]
需要把这个DataFrame拆分成4列,期望输出:
(4, 4) a b c d 0 40525 $$$$$ 9999 12345 1 40525 $$$$$ 8888 12345 2 40525 $$$$$ 7777 12345 3 40525 $$$$$ 6666 12345 ['a', 'b', 'c', 'd']
解决方案
方法1:拆分现有单列DataFrame
直接对已有的单列数据用str.split()分割,指定expand=True把分割结果扩展成多列,再重命名列名:
import pandas as pd # 原有读入代码 data_list = [] with open('input.txt', 'r') as data: for line in data: data_list.append(line.strip()) df = pd.DataFrame(data_list) # 拆分列并重命名 df = df[0].str.split(expand=True) df.columns = ['a', 'b', 'c', 'd'] # 可选:去掉a列前导的0,不需要的话删掉这行 df['a'] = df['a'].str.lstrip('0') # 验证输出 print(df.shape) print(df) print(df.columns.tolist())
方法2:读文件时直接拆分
在读入每行的时候就按空白字符分割成列表,这样转成DataFrame时直接就是多列,效率更高:
import pandas as pd data_list = [] with open('input.txt', 'r') as data: for line in data: # 按任意数量空白字符分割,自动忽略连续空格 split_line = line.strip().split() data_list.append(split_line) # 直接创建带列名的DataFrame df = pd.DataFrame(data_list, columns=['a', 'b', 'c', 'd']) # 可选:去掉a列前导的0 df['a'] = df['a'].str.lstrip('0') # 验证输出 print(df.shape) print(df) print(df.columns.tolist())
说明:split()不带参数时,会自动按任意数量的空白字符(空格、制表符等)分割,完美匹配你的文件格式。如果需要保留a列的前导0,删掉处理前导0的代码行即可。
内容的提问来源于stack exchange,提问作者yodish
相关产品推荐
相关产品推荐

