2017-06-06 7 views
0

私は6列のpandasデータフレームデータを持っています。データフレームはタブで区切られ、次のようになります。pandasはループなしで複数の条件に基づいてデータフレームから行を削除します

RO52_HUMAN TRIM6_HUMAN 1.83e-136 471 45.86 216 
RO52_HUMAN TRI68_HUMAN 6.46e-127 482 42.946 207 
RO52_HUMAN TRI22_HUMAN 6.49e-121 491 41.344 203 
RO52_HUMAN TRI38_HUMAN 7.15e-117 458 42.358 194 
RO52_HUMAN TRIM5_HUMAN 3.6e-114 499 40.281 201 
RO52_HUMAN TRI39_HUMAN 2.56e-111 490 39.388 193 
RO52_HUMAN TRI11_HUMAN 2.35e-109 471 43.524 205 
RO52_HUMAN TRI27_HUMAN 1.44e-108 495 37.576 186 
RO52_HUMAN TRI34_HUMAN 6.12e-105 500 43.0 215 
RO52_HUMAN TRI17_HUMAN 1.79e-87 461 37.093 171 

この行を削除する基準は、最初の2つの列のみによって異なります。また、辞書の全キーは、最初の2つの列のようなタンパク質IDであり、その値は他のタンパク質IDのリストでもあります。基本的には、次の場合にすべての行を削除します。

第1列の値がキーとして、第2列の値が辞書内のそのキーの値にある場合。私はこのために逆のロジックを書いて、私が書いたことは、私は私のファイルに読み込まれたデータフレームと呼ばれるこの

blast_out_filtered_df = blast_out_df[ -blast_out_df[0].isin(homolog_dict.keys()) | (blast_out_df[0].isin(homolog_dict.keys() & -blast_out_df[1].isin(homolog_dict[blast_out_df[0]]))) ] 

である(代わりにこれらの条件を満たさない行を保つために)どのようにいくつかを実行しようとしていますblast_out_dfとフィルタリングされた行で作成しようとしている新しいデータフレームはblast_out_filtered_dfです。このコードを実行しているOfcrourse は私に次のエラーを与えている:

Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
File "C:\Users\mstambou\AppData\Local\Continuum\Anaconda\lib\site- 
packages\pandas\core\generic.py", line 806, in __hash__ 
' hashed'.format(self.__class__.__name__)) 
TypeError: 'Series' objects are mutable, thus they cannot be hashed 

私は特定の行の列の値をインデックスに辞書をしようとしているためです。この作業を効率的に行うにはどうすればよいですか?私はusintintrorows()メソッドを実装しましたが、私は100万行以上ありましたが、これは遅すぎます。助言がありますか?ありがとうございました。この場合

homolog_dict['MAPK5_MOUSE'] 
['MAPK5_HUMAN'] 

キーは「MAPK5_MOUSE」で、値が1

+0

サンプルの「homolog_dict」辞書を投稿できますか? – MaxU

+0

>>> homolog_dict ['MAPK5_MOUSE'] ['MAPK5_HUMAN']ここに@ MaxU – user3289556

+0

それはdictのようには見えません。 [あなたの質問に投稿する](https://stackoverflow.com/q/44398932/5741205)できますか? – MaxU

答えて

0

がで解決策を見つけることができたの[「MAPK5_HUMAN」]リストである:

辞書には、次のようになります

dct_2 = dict(RO52_HUMAN=['TRI68_HUMAN', 'TRI67_HUMAN']) 

blast_out_df[map(isnt_in, zip(blast_out_df[1], blast_out_df[0].map(dct_2)))] 

と自分自身の関数を定義することによって:

def isnt_in(lst_item):  
    if str(lst_item[1])== 'nan': 
     return True 
    return lst_item[0] not in lst_item[1] 
これをやって

私の辞書の値がリストなので、それ自身のマップ関数はカットされません。また、自分の関数を定義しなければならなかったのは、マップがその辞書のキーを見つけることができない場合にマップがnp.nan値を返すため、このタスクの目的のために関数はTrueを返します。

関連する問題