【问题标题】:Writing rows of numbers to csv file, if they match the header将数字行写入 csv 文件,如果它们匹配标题
【发布时间】:2020-01-27 15:03:49
【问题描述】:

我有以下格式的 32 个制表符分隔的文本文件(显示 3 个):

文件名:90-4-0

gene_ID Genes Frag TPM Func
    1   23    34   43 some_function1
    2   43    66   11 some_function2
    3   54    22   88 some_function3

文件名:150-2-1

gene_ID Genes Frag TPM Func
    1   1    34   5    some_function1
    6   22    2   11   some_function6
    3   9     1   54   some_function3

文件名:90-2-0

gene_ID Genes Frag TPM Func
    9   54    21   4   some_function9
    11   2    6   143  some_function11
    3   99    44   8   some_function3

以此类推,每个文件大约有 2000 行。 32个文件的文件名格式为“SampleID-Timepoint-Status”,3个描述符均以“-”分隔。

  • SampleID 可以是任意两位或三位数字。
  • 时间点是 1-4 之间的数字
  • 状态为 0 或 1

现在,我希望我的最终输出如下所示(首选 csv 格式):

Sample_ID Timepoint Status gene_ID1 gene_ID2 gene_ID3 gene_ID6 gene_ID9 gene_ID11 *etc*.
90        4         0      43       11       88       0        0         0
150       2         1      5        0        54       11       0         0
90        2         0      0        0        8        0        4         143
*etc*

所有gene_ID 的编号来自文件中的“TPM”列。 “Genes”、“Frag”和“Func”可以忽略。我只是为了格式化而展示它们。 最终文件的尺寸大约为 32x2000。请记住,每个文件的gene_ID 数量可能会有所不同。对于某些基因ID 没有值的Sample_ID,它应该显示“0”(如表中所示)。

现在,我知道如何从文件名中获取文件 ID、时间点和状态,并且我知道如何将 32 个文件中的所有内容放入字典中。我已经尝试了将所有内容放入字典的任何组合。我还尝试将每 32 个 Sample_ID 放入 32 个具有各自值的单独列表中,但我不知道如何将它们与“gene_ID”联系起来。如果我将它们全部放在格式列表中:

Sample_ID Timepoint Status TPM_value ... TPM_value_n

如何将“TPM”值与“gene_IDs”关联起来?

如果您有时间,我愿意接受所有建议或帮助代码。

谢谢!!

【问题讨论】:

    标签: python list csv dataframe


    【解决方案1】:

    使用pd.concat,您可以合并行而无需填充所有空值。

    row_1 = pd.DataFrame({'Sample_id':[90],'Timepoint':[4],'Status':0,'gene_1':[43],'gene_3':[88],'gene_6':[56]})
    row_2 = pd.DataFrame({'Sample_id':[150],'Timepoint':[2],'Status':1,'gene_2':[53],'gene_3':[18],'gene_5':[16]})
    
    df = pd.concat([row_1,row_2],axis=0)
    

    将返回:

        Sample_id  Status  Timepoint  gene_1  gene_2  gene_3  gene_5  gene_6
    0         90       0          4    43.0     NaN      88     NaN    56.0
    0        150       1          2     NaN    53.0      18    16.0     NaN
    

    然后替换 NaNs

    df = df.replace(np.NaN,0)
    

    【讨论】:

    • 谢谢!!!我从来不知道这件事。那么如何将 Sample_ID、Timepoint 和 Status 连接到其余部分?我可以在一开始就把它们放在一个列表中吗?数据框是否必须只包含字典?
    • @Alex 是的,您可以指定它们是每一行的列。我会更新我的答案以反映这一点。
    • 啊,我明白了!非常感谢!当我想将其写入 csv 文件时,您建议我如何使用这种格式?
    • @Alex pandas 有 to_csv function
    • 我明白了,聪明!最后一件事,熊猫有某种附加功能吗?当我想将字典中的值附加到数据框时?
    猜你喜欢
    • 2018-03-21
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2021-09-21
    • 2021-07-05
    相关资源
    最近更新 更多