【问题标题】:Python problem importing pandas dataframe导入熊猫数据框的Python问题
【发布时间】:2021-12-29 07:54:40
【问题描述】:

我有一个具有这种结构的 csv 文件:

Path name Path ID Phenotype data
path name 1 ID 1 Table 1
path name 2 ID 2 Table 2

最后一个单元格中的每个表格都有这样的结构:

Gene_MGI_ID Gene_ENSEMBL_ID Phenotype list
MGI_1 ENS_1 [Pheno1,Pheno2,Pheno 3,...]
MGI_2 ENS_2 [Pheno5,Pheno8,Pheno 9,...]

我正在使用此代码导入文件:

path=pd.read_csv(dir+"path_dataset.csv", header=0, index_col=0)

问题在于最后一列不是包含这 3 列的数据框,而是单个字符串。例如,导入后的第一个表由以下字符串表示:

'      MGI_ID              ENS_ID                                         Pheno_list\n0  MGI:99702  ENSMUSG00000003873  [MP:0000218, MP:0000321, MP:0000571, MP:000069...'

如何在上述数据框中转换此字符串? 这里以表格的前三个元素作为 csv 文件结构的示例:

,Pathway,Path_ID,Pheno_data
0,response to organophosphorus,GO:0046683,"      MGI_ID              ENS_ID                                         Pheno_list
0  MGI:96648  ENSMUSG00000071076  [MP:0000278, MP:0000351, MP:0001156, MP:000126..."
1,response to cAMP,GO:0051591,"      MGI_ID              ENS_ID                                         Pheno_list
0  MGI:96648  ENSMUSG00000071076  [MP:0000278, MP:0000351, MP:0001156, MP:000126..."
2,secondary metabolite biosynthetic process,GO:0044550,"        MGI_ID              ENS_ID    Pheno_list

【问题讨论】:

  • 你的 csv 文件的分隔符是什么?您应该将其指定为参数,例如:path=pd.read_csv(dir+"path_dataset.csv", sep='\t', header=0, index_col=0)
  • 我用p.to_csv("Results/path_dataset.csv", header=True, sep=",")保存了文件,但在导入时也使用了“sep=','”,结果相同
  • 你能在问题中发布几行你的csv吗?
  • @Tranbi 当然,我在底部添加了它
  • 你是如何在你的 csv 中写出那些长长的多行字符串的?我想它们也应该用, 分隔...?

标签: python pandas string dataframe csv


【解决方案1】:

pheno_data 看起来像是将数据帧的文本转储到单个单元格中。由于默认格式,它截断了输出,[ 没有结束 ],最后一个值显示 ...

您的示例还缺少最后一行的后半部分(没有结束 ")。对于以下示例(添加了最后一行):

,Pathway,Path_ID,Pheno_data
0,response to organophosphorus,GO:0046683,"      MGI_ID              ENS_ID                                         Pheno_list
0  MGI:96648  ENSMUSG00000071076  [MP:0000278, MP:0000351, MP:0001156, MP:000126..."
1,response to cAMP,GO:0051591,"      MGI_ID              ENS_ID                                         Pheno_list
0  MGI:96648  ENSMUSG00000071076  [MP:0000278, MP:0000351, MP:0001156, MP:000126..."
2,secondary metabolite biosynthetic process,GO:0044550,"        MGI_ID              ENS_ID    Pheno_list
0  MGI:96648  ENSMUSG00000071076  [MP:0000278, MP:0000351, MP:0001156, MP:000126..."

以下脚本可用于读取值:

import pandas as pd
import csv
import io

data = []

with open('input.csv') as f_input:
    csv_input = csv.reader(f_input)
    header = next(csv_input)
    
    for row in csv_input:
        sub_csv = csv.reader(io.StringIO(row[3]), delimiter=' ', skipinitialspace=True)
        sub_header = next(sub_csv)
        sub_row = next(sub_csv)
        pheno_list = [v.strip('[.,') for v in sub_row[3:]]
        data.append([*row[:2], *sub_row[:3], *pheno_list])
        
df = pd.DataFrame(data, columns=[*header[:3], *sub_header[:2], *[f'p{i}' for i in range(1, 5)]])

print(df)

这将给出一个数据框:

                                        Pathway Path_ID     MGI_ID              ENS_ID          p1          p2          p3         p4
0  0               response to organophosphorus       0  MGI:96648  ENSMUSG00000071076  MP:0000278  MP:0000351  MP:0001156  MP:000126
1  1                           response to cAMP       0  MGI:96648  ENSMUSG00000071076  MP:0000278  MP:0000351  MP:0001156  MP:000126
2  2  secondary metabolite biosynthetic process       0  MGI:96648  ENSMUSG00000071076  MP:0000278  MP:0000351  MP:0001156  MP:000126

如果您在读取文件时遇到问题,请尝试添加 print(row) 以查看失败的位置。


要将 pheno 类型保留为单个条目,请更改以下两行:

data.append([*row[:2], *sub_row[:3], ', '.join(pheno_list)])
    
df = pd.DataFrame(data, columns=[*header[:3], *sub_header[:3]])

【讨论】:

  • 感谢您的帮助。只是一个问题:有可能将表型(您称为 p1、p2、...的列)全部放在一个列中作为列表?还是我必须像您的示例中那样将它们分开?
  • 它们可以合并成一个字符串值,我添加了一个例子
猜你喜欢
  • 2018-10-25
  • 1970-01-01
  • 1970-01-01
  • 2020-04-21
  • 2013-02-04
  • 1970-01-01
  • 2020-02-25
  • 2019-05-26
  • 1970-01-01
相关资源
最近更新 更多