質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

2888閲覧

pythonのpandasを用いて、条件に合う行に他のファイルの値を新しい列として加えたい

ars_lon

総合スコア13

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2018/12/04 08:33

編集2018/12/04 11:58

手元に2つのファイルがあります。
1つは遺伝子名と疾患名の対応表です。

gene disease
A2ML1 noonan syndrome
AAR2 developmental delay, microcephaly, brain & hea...
AARS charcot-marie-tooth disease, type ii, charcot-...
...

もう一つは解析結果のファイルで、16列目がgene,17列目がgene_IDとなっています。
16列目のgeneは

gene
GSTM1
LOC101927027,PRKRA
CCZ1
CDK13,HIGD1AP7,MPLKIP,C7orf10
IGH,KIAA0125,IGHD2-8,IGHD1-7,IGHD6-6,IGHD5-5,IGHD4-4
...

のようになっていて、複数の場合はカンマで区切られています。
この2つ目のファイルのgeneが1つ目のファイルの対応表に含まれている場合、2つ目のファイルの18列目と19列目(ファイルは全部で17列です)に、その遺伝子名と疾患名を加えようとしています。geneが複数ある場合は、改行して、1から17列目はgeneの数だけ同じ内容を並べたいです。
欲しいファイルの形は

a1,a2,...,a17,GSTM1,疾患名
b1,b2,...,b17,LOC101927027,疾患名
b1,b2,...,b17,PRKRA,疾患名
c1,c2,...,c17,CCZ1,疾患名
...
です。

【やったこと】

import numpy as np from pandas import Series,DataFrame import pandas as pd import re df1 = pd.read_table("遺伝子疾患対応表.txt") dic = {df1.iloc[i,0] : df1.iloc[i,1] for i in range(df1.shape[0])}

遺伝子と疾患の対応を辞書にしました。

df2 = pd.read_table("解析結果.txt")

geneが1つでカンマがない場合は、

def toOverlapGene(row): gene_name = row['gene'] if gene_name in dic: row['gene_name'] = gene_name+'\t'+dic[gene_name] return row df2 = df2.apply(toOverlapGene,axis=1) df2 = df2.dropna(how='any') print(df2) df2.to_excel('結果ファイル.xlsx')

でなんとかなったのですが、geneが複数の時の方法がよくわかりません。

for i in range(df2.shape[0]): if ',' in df2.iloc[i,15]: genes = df2.iloc[i,15].split(',') for j in range(len(genes)): gene = genes[j] if gene in dic: print(df2.iloc[i]+'\t'+gene+'\t'+dic[gene])

で1つ目のファイルに載っていたgene,疾患名を追加しようとしましたが、

TypeError: ufunc 'add' did not contain a loop with signature matching types dtype('<U32') dtype('<U32') dtype('<U32')

というエラーが出てしまいました。

何かいい方法をご存知の方は教えていただけますと助かります。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2018/12/04 08:35

インデントがなくなって確認、実行できないのでソースコードはコードブロックで囲んでください。
ars_lon

2018/12/04 11:59

大変失礼しました。ソースコードをコードブロックで囲いました。よろしくお願い致します。
guest

回答1

0

ベストアンサー

私がもし問題を正しく理解できていれば、なのですが、次の 2 つのステップに分けて処理されるのがよいかと思います。

  1. 解析結果.txt の 17 列目を複数行に分割する
  2. 解析結果.txt遺伝子疾患対応表.txt を付き合わせて 18 ・ 19 列目を追加する

1 が達成できれば 2 はおそらく特に問題なくできそうかなと思いますので、以下 1 についてのみ説明させていただきますね。

pandas を使う前提であれば、 split() stack() あたりのメソッドを駆使すると , 区切りのカラムを複数行に分割することができるものと思います。

例えば次のような DataFrame の変換を行うには、

text

1Before: 2 other1 other2 gene 30 a d GSTM1 41 b e LOC101927027,PRKRA 5 6After: 7 other1 other2 gene 80 a c GSTM1 91 b d LOC101927027 102 b d PRKRA

次のような関数を書くとよいと思います。

python

1import pandas as pd 2 3 4def stack_with_column(df, column): 5 """DataFrame の指定されたカラムを `,` で分割して複数行に展開する 6 """ 7 stacked_column = ( 8 df[column].str.split(',', expand=True) 9 .stack() 10 .reset_index(1, drop=True) 11 .to_frame(column) 12 ) 13 original_without_column = df.drop(column, axis=1) 14 stacked = ( 15 original_without_column 16 .join(stacked_column) 17 .reset_index(drop=True) 18 [df.columns] 19 ) 20 return stacked 21 22 23df = pd.DataFrame({ 24 'other1': ['a', 'b'], 25 'other2': ['c', 'd'], 26 'gene': ['GSTM1', 'LOC101927027,PRKRA'], 27}) 28 29stack_with_column(df) 30# => 31# other1 other2 gene 32# 0 a c GSTM1 33# 1 b d LOC101927027 34# 2 b d PRKRA

これができたら後は 2 の「 解析結果.txt遺伝子疾患対応表.txt を付き合わせて 18 ・ 19 列目を追加する 」を行えば完成、ではないかと思いますがいかがでしょうか。

各メソッドの意味は pandas の公式ドキュメントに詳しく書かれているのでそちらをご参照ください。

次のページもご参考になるものと思います:

ご参考になれば幸いです。

(再利用できそうなので関数を GitHub Gist に置かせていただきました)

投稿2018/12/08 11:55

編集2018/12/08 11:57
gh640

総合スコア1407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ars_lon

2018/12/09 09:58

ご回答ありがとうございます、無事にデータの形を変えることができました! ご丁寧に参考ページまでありがとうございます。勉強させていただきます♬
gh640

2018/12/10 02:28

そうでしたか。ご丁寧に結果をお知らせくださりありがとうございます!よかったです ????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問