for文を用いて表を作る
自分用の備忘録です。もし参考になる方がいればコピペしてください!
モチベーション: たくさんの個別ファイルにcsvファイルが格納されている。その中で必要なcolumnのみを抜き出して新たに表を作りたい。しかし、個別ファイルの下記のGenes(遺伝子)の項目は変異があるときのみ記載されていて、変異がないときは表に入らない。従って、全てのファイルを結合して最終的に欠損しているところは変異なし(No Mutation)を入れることになる。
(追記 8/17) CbioPortalというサイトから遺伝子変異情報を集めて結合するときに使いました。自分自身PyThonそんなに得意ではなくてこのコードが無駄が多いとも思ってますのでコメントいただけると嬉しいです! ⇨ @WolfMoon さんにRとPythonでのコードをいただきました、ということで動作するとはいえど素人の私のコードよりコメント欄を見ていただいた方が良いです!!!Sorry!
例:ファイル1, ファイル2, ・・・と各ファイルに患者データが入っている。例えばファイル1には患者番号0001のデータが下記のように格納されている。(Genesに対してMutationがあるときのみ行が作られているようなファイルで、Mutationがないときはそもそも列として入ってない)
Genes | Mutation Type | Information | Project |
---|---|---|---|
TP53 | Missense | Complete | IMPACT sequencing |
KRAS | Nonsesense | Half-way | METABORIC cohort |
EGFR | deletion | Unevalueted | IMPACT sequencing |
Genes | Mutation Type | Information | Project |
---|---|---|---|
STK11 | Missense | Complete | IMPACT sequencing |
KRAS | deleteion | Complete | IMACT sequencing |
SMARCA4 | Nonesense | Unevalueted | IMPACT sequencing |
といった個別ファイルがたくさんあります、、、、
このうち遺伝子変異情報のみを取り出し、それを各患者について集めて下記のような表を作りたい
PatientID | TP53 | KRAS | EGFR | STK11 | SMARCA4 |
---|---|---|---|---|---|
Patient0001 | Missense | None | Missense | Missense | Missense |
Patient0002 | None | Indel | Indel | No mutation | Missense |
Patient0003 | deletion | Nonsense | Nonsense | Deletion | No Mutation |
以下にコードを示す (Google colaboratory上を想定)
from pandas._libs.algos import diff_2d
import pandas as pd
from pathlib import Path
import glob
#Google colab上でdataというフォルダに無数のcsvファイルを格納している
#従って、指定するpathは下記の通り
path = Path('/content/data')
#.csvとなっているcsvファイルを全て取得する。関係ないcsvファイルは消すか、より詳細に指定する
#最初にファイルが全部入ったリストを作っておく
file_list1 = glob.glob('**/*.csv')
for i, file in enumerate(path.glob('*.csv')):
#filenameを取得する。これは各個別ファイルの名前にPatientIDが入っているのを想定している
#例えばファイル名がPatient0001, Patient0002などとなっている際にこれを列に入れる
#[5:17]とは、file_list[i]がpathも含めたものを返すからである。試しにfilename[0]を出力してdata/PatientID0001/となっていれば欲しいのは[5:17]のみである
filename=file_list1[i][5:17]
#csvファイルを読み込む
df = pd.read_csv(file)
#各ファイルからほしい列を抜き出してリストにする
genes=df["Genes"].tolist()
#insertしているのは、個別の表を転置して結合するので、一番左の列を新しく作るため
genes.insert(0, "PatientID")
mutation=df["MutationType"].tolist()
mutation.insert(0,filename)
df2 = pd.Series(data = mutation, index = genes)
df2 = pd.DataFrame(df2).T
#colab内にshapedという名前のファイルを作り、そこへ格納する。
df2.to_csv('shaped'+str(filename)+'.csv')
csv_files = glob.glob('*.csv')
#csvファイルの中身を追加していくリストを用意
data_list = []
#読み込むファイルのリストを操作
for file in csv_files:
data_list.append(pd.read_csv(file))
#リストを全て行方向に結合
#axis=0:行方向に結合, sort
df = pd.concat(data_list, axis=0, sort=True)
df.to_csv("complete.csv",index=False)