我想从多个文件创建一个矩阵。这些文件中的每一个都具有各种长度的基因名称列表。
要创建矩阵,我需要将第一列中所有文件的所有基因名称分组。
然后为每个文件附加一个新列(文件名作为标题),如果基因名称在附加列表中,则向单元格添加值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
答案 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)