基于Pandas拆分单列KEGG Drug数据库为结构化多列
解决方案:将KEGG Drug单列CSV转换为结构化DataFrame
问题概述
现有一个75万行的KEGG Drug数据库CSV文件,仅含单列数据:每行以;结尾,数据元素用///分隔(列尾也带有///)。需要将其拆分为以ENTRY、NAME等大写标识为表头的结构化DataFrame,缺失字段自动填充NaN。
实现代码
import pandas as pd # 1. 读取原始CSV文件(单列,无表头) # 替换为你的实际文件路径 df_raw = pd.read_csv('kegg_drug.csv', header=None, names=['raw_content']) # 2. 预处理每行数据:去除末尾的';',按'///'分割并过滤空元素 def process_row(row): # 移除行尾分号 cleaned = row.rstrip(';') # 分割元素并清理空白,过滤空字符串 elements = [elem.strip() for elem in cleaned.split('///') if elem.strip()] # 解析为键值对字典 entry_dict = {} for elem in elements: # 仅分割第一个冒号,避免值内冒号导致解析错误 if ': ' in elem: key, value = elem.split(': ', 1) entry_dict[key.strip()] = value.strip() return entry_dict # 3. 批量处理所有行,生成字典列表 records = df_raw['raw_content'].apply(process_row).tolist() # 4. 转换为结构化DataFrame,缺失字段自动填充NaN structured_df = pd.DataFrame.from_records(records) # 可选:指定固定列顺序 target_columns = ['ENTRY', 'NAME', 'FORMULA', 'COMPONENT'] structured_df = structured_df.reindex(columns=target_columns) # 查看结果示例 print(structured_df.head())
关键说明
- 文件读取:用
header=None和names指定列名,确保正确读取单列无表头数据。 - 行预处理:
rstrip(';')清理行尾分号,split('///')分割元素后过滤空字符串,避免无效数据干扰。 - 键值解析:
split(': ', 1)只分割第一个冒号,防止值中包含冒号(如带注释的NAME字段)导致的解析错误。 - 效率优化:
apply结合from_records的方式,相比逐行循环更适配75万行的大数据量,兼顾效率与可读性。 - 列序调整:通过
reindex可以固定输出列的顺序,匹配需求中的示例格式。
内容的提问来源于stack exchange,提问作者Mr.Slow
相关产品推荐
相关产品推荐

