Python(Pandas),为每个新文件追加新列

时间:2017-01-04 13:33:33

标签: python pandas

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

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

然后为每个文件附加一个新列(文件名作为标题),如果基因名称在附加列表中,则向单元格添加值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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

在使用df.columns = [filename]为新数据框提供列名之前。

答案 2 :(得分:0)

您应该可以通过将基因名称放在索引中并使用文件名作为列名创建所有1的列然后连接来轻松完成此操作。这应该在一个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)