【问题标题】:Python(Pandas), append new column for each new filePython(熊猫),为每个新文件附加新列
【发布时间】:2017-05-18 19:40:13
【问题描述】:

我想从多个文件创建一个矩阵。这些文件中的每一个都有一个不同长度的基因名称列表。

要创建矩阵,我需要对第一列中所有文件中的所有基因名称进行分组。

然后为每个文件添加一个新列(以文件名作为标题),如果基因名称在附加列表中,则将值 1 添加到单元格中,否则如果第一列中的基因名称在追加的新列加零。

这是我到目前为止得到的:

import os

files= os.listdir("/gene_files")

df01 = pd.DataFrame()

for file in files:
    file_name = "/gene_files/" + file
    for file in file:
    df = pd.read_csv(file, sep='\t', header = 0)
    df01 = pd.concat(df01,df)
df01.to_csv('gene_matrix.csv')

这给了我一列中的所有基因列表。然后我删除所有重复项。

df01 = df01.drop_duplicates

现在我需要为每个文件添加一个新列,评估geneName(file) 是否在第一列并相应地添加 1 或 0。我被困住了……而且完全糊涂了。

文件如下所示:

File1          File2         File3          etc...

GeneName      GeneName       GeneName
  A              B              A
  B              C              B
  C              D              E
  F              E              F

我想要的输出是矩阵/数据框:

GeneName  File1    File2   File3
A           1        0       1  
B           1        1       1
C           1        1       0
D           0        1       0 
E           0        1       1 
F           1        0       1 

这些是文件的实际前几行:

     fileAIB          fileAIC           fileAID
     Plekha4           Dffb             Rabggta
    1700012D01Rik     A430033K04Rik      Sc5d
     Isg20             Tubb3            Gnpnat1
     Smad6             Rbm17            Nabp1
     Ndufa10           Isg20            Isg20
     Wdr90             Arrb2            Lrrc27
     Thumpd1           Ankrd13c         Add3
     Cd2bp2            Ndufa10          Prkaa1
     Cndp2             Inpp5e           Gmeb2
     Jmjd1c            Lamtor2          B4galt7

输出如下:

GeneName    fileAIB       fileAIC           fileAID
Plekha4         1            0                 0
1700012D01Rik   1            0                 0
Isg20           1            1                 1
Smad6           1            0                 0
Ndufa10         1            0                 0
Wdr90           1            0                 0
Thumpd1         1            0                 0
Cd2bp2          1            0                 0
Rbm17           1            0                 1
Jmjd1c          1            0                 0
Dffb            0            1                 0
A430033K04Rik   0            1                 0
Tubb3           0            1                 1
Rbm17           0            1                 0
Arrb2           0            1                 0
Ankrd13c        0            1                 0
Ndufa10         0            1                 0
Gnpnat1         0            1                 0
Lamtor2         0            1                 0
Rabggta         0            0                 1
Sc5d            0            0                 1
Gnpnat1         0            0                 1
Lrrc27          0            0                 1
Prkaa1          0            0                 1
Gmeb2           0            0                 1
B4galt7         0            0                 1

【问题讨论】:

  • 为什么第二个for 循环之后的行由于缩进而无法编译? geneName() 是什么?定义的函数?请展示一些数据来说明。
  • 哦,对不起.. () 只是为了澄清我需要将文件中的基因名称与第一列进行比较。甚至没想到它看起来像一个函数。
  • 我们能看到文件的内容吗?和数据框,尤其是第一列?期望的结果也会很棒。只需要几行。帮助我们帮助您。
  • 编辑了问题以包含一些内容。这个可以吗?我不知道如何分享它。

标签: python pandas


【解决方案1】:

尝试使用带有axis 属性的pd.concat()。在你的情况下: df01 = pd.concat([df01, df], axis=1)

在您可以使用df.columns = [filename] 为新数据框指定列名之前。

【讨论】:

    【解决方案2】:

    您应该能够轻松地做到这一点,方法是将基因名称放入索引中,并创建一列全为的列,以文件名作为列名,然后连接。这应该在一个 for 循环中完全完成。您当前的 for 循环语法看起来不正确。尝试以下类似的方法,假设您在从 read_csv 读取时有一个列名为“GeneName”的单列数据框。

    import os
    
    files= os.listdir("/gene_files")
    df_list = []
    
    for file in files:
        df = pd.read_csv(file, sep='\t', header = 0)
        df[file] = 1
        df.set_index('GeneName')
        df_list.append(df)
    
    pd.concat(df_list, axis=1).fillna(0)
    

    【讨论】:

      【解决方案3】:

      考虑将所有文本文件数据附加到长格式数据框中,然后转为宽格式:

      dfList = []
      
      for file in files:
          df = pd.read_csv(file, sep='\t', header = None, names = ['GeneName'])        
          df = df.assign(file = file.replace('.txt', ''), num = 1)
          dfList.append(df)
      
      finaldf = pd.concat(dfList)
      
      # PIVOT (LONG TO WIDE)
      finaldf = finaldf.pivot_table(index=['GeneName'], columns=['file'], 
                                    values='num', aggfunc='count').fillna(0).reset_index()    
      # CONVERT TO INTEGER
      numcols = list(range(1,len(finaldf.columns)))
      finaldf.ix[:,numcols] = finaldf.ix[:,numcols].astype(int)
      

      输出 (使用发布的实际三列作为 .txt 文件)

      # file       GeneName          fileAIB          fileAIC          fileAID
      # 0     1700012D01Rik                1                0                0
      # 1     A430033K04Rik                0                1                0
      # 2              Add3                0                0                1
      # 3          Ankrd13c                0                1                0
      # 4             Arrb2                0                1                0
      # 5           B4galt7                0                0                1
      # 6            Cd2bp2                1                0                0
      # 7             Cndp2                1                0                0
      # 8              Dffb                0                1                0
      # 9             Gmeb2                0                0                1
      # 10          Gnpnat1                0                0                1
      # 11           Inpp5e                0                1                0
      # 12            Isg20                1                1                1
      # 13           Jmjd1c                1                0                0
      # 14          Lamtor2                0                1                0
      # 15           Lrrc27                0                0                1
      # 16            Nabp1                0                0                1
      # 17          Ndufa10                1                1                0
      # 18          Plekha4                1                0                0
      # 19           Prkaa1                0                0                1
      # 20          Rabggta                0                0                1
      # 21            Rbm17                0                1                0
      # 22             Sc5d                0                0                1
      # 23            Smad6                1                0                0
      # 24          Thumpd1                1                0                0
      # 25            Tubb3                0                1                0
      # 26            Wdr90                1                0                0
      

      【讨论】:

      • 冻糕你是我的英雄。很棒的解决方案。工作超级好!我可能也开始喜欢数据了。谢谢
      猜你喜欢
      • 2020-09-19
      • 2022-01-26
      • 1970-01-01
      • 2017-07-28
      • 1970-01-01
      • 2021-09-04
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      相关资源
      最近更新 更多