Python(pandaps),为每个新fi附加新列

2024-05-19 08:58:01 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

这给了我一列所有的基因列表。然后我把所有的复制品都放下。在

^{pr2}$

现在我需要为每个文件追加一个新列,计算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

Tags: 文件csv列表基因矩阵filesfilepd
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文件)

^{pr2}$

您应该能够很容易地做到这一点,方法是将基因名放入索引中,并以文件名作为列名创建一个包含所有基因的列,然后进行连接。这应该在一个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)

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

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

相关问题 更多 >

    热门问题