如何将pandas DataFrame中CSV格式的Series列解析为新DataFrame?
解析DataFrame中字符串列的最优方法
场景说明
我有一个从CSV导入的DataFrame:
import pandas as pd df = pd.DataFrame( { "date": ["2022-08-01T12:21:05", "2022-08-01T12:21:12", "2022-08-01T12:21:05"], "content": [ "1659356463,1.245050,0.000000", "1659356479,1.245050,0.000000", "1659356494,1.245050,0.000000", ], } )
需要把df['content']列解析成如下结构的DataFrame,方便后续导出为新CSV:
final_df = pd.DataFrame( { "timestamp": ["1659356463", "1659356479", "1659356494"], "tilt": ["1.245050", "1.246782", "1.230922"], "threshold": ["0.000000", "0.000000", "1.000000"], } )
最优解决方案
以下是几种高效的处理方法,可根据数据规模和需求选择:
1. 简洁首选:str.split直接拆分
适合小规模数据,代码简洁易读:
# 拆分content列,expand=True将拆分结果转为多列DataFrame content_df = df['content'].str.split(',', expand=True) # 给拆分后的列指定名称 content_df.columns = ['timestamp', 'tilt', 'threshold'] # 若需要保留原date列,直接合并即可 final_df = pd.concat([df['date'], content_df], axis=1)
2. 性能最优:pd.read_csv配合io.StringIO
处理大规模数据时优先用这个,复用pandas优化后的CSV解析引擎:
import io # 将所有content行拼接成标准CSV格式的字符串 csv_content = '\n'.join(df['content'].tolist()) # 用StringIO模拟文件对象,读取为DataFrame content_df = pd.read_csv(io.StringIO(csv_content), header=None, names=['timestamp', 'tilt', 'threshold']) # 合并原date列(可选) final_df = pd.concat([df['date'], content_df], axis=1)
3. 灵活可控:csv.reader逐行解析
如果需要在解析时添加自定义逻辑(比如数据校验、转换),用这个更灵活:
import csv from io import StringIO parsed_rows = [] for line in df['content']: # 用StringIO包裹单行字符串,让csv.reader可以解析 reader = csv.reader(StringIO(line)) parsed_rows.append(next(reader)) content_df = pd.DataFrame(parsed_rows, columns=['timestamp', 'tilt', 'threshold']) final_df = pd.concat([df['date'], content_df], axis=1)
内容的提问来源于stack exchange,提问作者rochard4u
相关产品推荐
相关产品推荐

