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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 08:15:34