2017-07-06 5 views
1

私はマップする必要がある(データが生物学のおかげです)2つの全く異なるデータフレームを持っています。そこにあるパンダのチュートリアルはすべて、ずっと簡単な変換であり、成功していないネストされた4つのループなしで、これを解決することはできません。 Excelに戻らずにこの問題を解決するための非常に不思議な方法に興味があります。Pandas:異なるサイズのDataFrames間の複雑なマッピング

最初は、このdf1のようなものです。 a-jカテゴリーの何千もの遺伝子の0および1の観測。

import pandas as pd 
import numpy as np 

df1 = pd.DataFrame(np.random.randint(0,2,size =(10,10)),columns=list('abcdefghij'), index = ['gene1','gene2','gene3','gene4','gene5','gene6','gene7','gene8','gene9','gene10']) 

print(df1) 

     a b c d e f g h i j 
gene1 1 0 1 0 1 0 1 1 1 0 
gene2 0 1 0 0 0 0 0 0 1 0 
gene3 0 1 1 1 1 1 0 0 0 0 
gene4 1 0 1 0 0 1 0 1 1 1 
gene5 0 0 1 0 0 0 0 0 0 0 
gene6 0 1 0 0 1 0 1 0 1 0 
gene7 1 1 0 1 1 0 0 0 1 0 
gene8 0 0 0 1 1 1 1 0 1 0 
gene9 1 0 1 0 1 0 1 1 0 1 
gene10 1 0 0 0 1 0 1 0 1 1 

次に、このdf2のようなものです。下位レベルのものの上位レベルのカテゴリ(X-W)のマッピング。この女の子にはNaNと索引はありません。

df2 = pd.DataFrame({'X': ['a','NaN','NaN','NaN'], 
         'Y': ['d', 'b', 'c','f'], 
         'Z':['g', 'h','e','NaN'], 
         'W': ['i', 'j','NaN','Nan']},index=None) 

print(df2) 

    W X Y Z 
0 i a d g 
1 j NaN b h 
2 NaN NaN c e 
3 Nan NaN f NaN 

私が必要とするものは、result1のようなものです。ここに別のトリッキーなものがあります。例えば。 gene4はiとjのカテゴリにあり、どちらもWにありますが、result1.loc ['gene4'、 'W']には '1'だけが必要です。最終的な結果は依然としてバイナリである必要があります。

result1 = pd.DataFrame({'X': ['1','0','0','1','0','0','1','0','1','1'], 
        'Y': ['1','1','1','1','1','1','1','1','1','0'], 
        'Z': ['1','0','1','1','0','1','1','1','1','1'], 
        'W': ['1','1','0','1','0','1','1','1','1','1']}, index = ['gene1','gene2','gene3','gene4','gene5','gene6','gene7','gene8','gene9','gene10']) 
print(result1) 


     W X Y Z 
gene1 1 1 1 1 
gene2 1 0 1 0 
gene3 0 0 1 1 
gene4 1 1 1 1 
gene5 0 0 1 0 
gene6 1 0 1 1 
gene7 1 1 1 1 
gene8 1 0 1 1 
gene9 1 1 1 1 
gene10 1 1 0 1 

これは別の可能な結果フォーマットでもあります。 [実際の予想結果で更新されました]。誰かが両方(または簡単な相互変換)、多くの特別な感謝、そして科学を教えるように感じている場合は、また感謝しています。

result1 = pd.DataFrame({'1': ['gene1','gene1','gene1','gene1'], 
         '2': ['gene2','gene4','gene2','gene3'], 
         '3': ['gene4','gene7','gene3','gene4'], 
         '4': ['gene6','gene9','gene4','gene6'], 
         '5': ['gene7','gene10','gene5','gene7'], 
         '6': ['gene8','NaN','gene6','gene8'], 
         '7': ['gene9','NaN','gene7','gene9'], 
         '8': ['gene10','NaN','gene8','gene10'], 
         '9': ['NaN','NaN','gene9','NaN'], 
         }, 
         index = ['W','X','Y','Z']) 
print(result1) 

     1  2  3  4  5  6  7  8  9 
W gene1 gene2 gene4 gene6 gene7 gene8 gene9 gene10 NaN 
X gene1 gene4 gene7 gene9 gene10 NaN NaN  NaN NaN 
Y gene1 gene2 gene3 gene4 gene5 gene6 gene7 gene8 gene9 
Z gene1 gene3 gene4 gene6 gene7 gene8 gene9 gene10 NaN 

この長い質問を読んでいただき、ありがとうございます。

+0

?あなたは一連の疑問符とランダムなデータを提供します。これらの例を作成する際に問題が発生した場合(最初の質問には非常に便利です)、残りの部分を行ってデータフレームを作成してくださいあなたは欲しい。 –

+0

あなたは正しいです、謝罪します。疑問符の配列を追加するのは難しくありませんでした。作成したばかりのものを4回コピーしました。私はおもちゃの例を解決し、期待される結果のデータフレームを編集します。 – JRCX

答えて

1

ここに行きます!これを試してみましょう。

df1 = pd.DataFrame(np.random.randint(0,2,size =(10,10)),columns=list('abcdefghij'), index = ['gene1','gene2','gene3','gene4','gene5','gene6','gene7','gene8','gene9','gene10']) 

df2 = pd.DataFrame({'X': ['a','NaN','NaN','NaN'], 
         'Y': ['d', 'b', 'c','f'], 
         'Z':['g', 'h','e','NaN'], 
         'W': ['i', 'j','NaN','NaN']},index=None) 

df2 = df2.replace('NaN',np.nan) 

gmap = df2.stack().reset_index().drop('level_0',axis=1).set_index(0)['level_1'] 

df3 = df1.stack().replace(0,np.nan).dropna().reset_index(level=1)['level_1'].map(gmap).reset_index().drop_duplicates() 

df_out = df3.groupby(['index','level_1'])['level_1'].count().unstack() 

print(df_out) 

出力:

level_1 W X Y Z 
index      
gene1 1.0 NaN NaN NaN 
gene10 1.0 1.0 1.0 1.0 
gene2 1.0 1.0 1.0 1.0 
gene3 1.0 1.0 1.0 1.0 
gene4 1.0 NaN 1.0 1.0 
gene5 1.0 NaN 1.0 NaN 
gene6 1.0 1.0 1.0 1.0 
gene7 NaN 1.0 1.0 1.0 
gene8 NaN NaN 1.0 1.0 
gene9 1.0 NaN NaN 1.0 

編集オプションの出力を取得するには

df1 = pd.DataFrame(np.random.randint(0,2,size =(10,10)),columns=list('abcdefghij'), index = ['gene1','gene2','gene3','gene4','gene5','gene6','gene7','gene8','gene9','gene10']) 

df2 = pd.DataFrame({'X': ['a','NaN','NaN','NaN'], 
         'Y': ['d', 'b', 'c','f'], 
         'Z':['g', 'h','e','NaN'], 
         'W': ['i', 'j','NaN','NaN']},index=None) 

df2 = df2.replace('NaN',np.nan) 

gmap = df2.stack().reset_index().drop('level_0',axis=1).set_index(0)['level_1'] 

df3 = df1.stack().replace(0,np.nan).dropna().reset_index(level=1)['level_1'].map(gmap).reset_index().drop_duplicates() 

df3['cols'] = df3['index'].str.split('gene').str[1].astype(int) 

df_out2 = df3.set_index(['level_1','cols'])['index'].unstack() 

出力:*正確に*の関係はここで何

cols  1  2  3  4  5  6  7  8  9  10 
level_1                  
W  gene1 gene2 gene3 gene4 gene5 None gene7 gene8 gene9 gene10 
X   None None gene3 None gene5 None None gene8 gene9 gene10 
Y  gene1 gene2 gene3 gene4 gene5 gene6 gene7 gene8 gene9 gene10 
Z   None gene2 None gene4 None gene6 None gene8 gene9 None 
+0

すごい! Pythonは確かに魔法です。 NaNの代わりにマイナーディテールを使用しましたが、最終結果ではゼロが欲しかったのですが、もちろんdf_out.fillna(0)を使って素早く行うことができます。ありがとうございました! – JRCX

+0

ようこそ。 –

+0

@JRCX解決策に合わせて編集すると、オプションの出力も得られます。 –

関連する問題