2017-06-06 31 views
0

我有6列熊貓數據幀數據,我想根據特定條件處理和刪除一些行。數據框是製表符分隔的,如下所示:熊貓根據多個條件從數據幀中刪除行而不發生循環

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 

刪除行的條件僅取決於前兩列。我也有一個字典,整個鍵都是蛋白質ID,就像前兩列中的蛋白質ID一樣,這些值也是其他蛋白質ID的列表。基本上我想刪除所有行,如果:

第一列的值在字典中作爲關鍵字,如果第二列的值在字典中的該關鍵字的值。我寫的反向邏輯對於這一點,並試圖執行它一些如何(而不是保持不滿足這些條件的行)我寫的是這個

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 

這是因爲我想用索引的列的值的字典在一個特定的行。我該如何有效地進行這項操作?我實現了usint .iterrrows()方法,但是我有超過一百萬行,這太慢了。有什麼建議麼?謝謝。

詞典是這樣的:

homolog_dict['MAPK5_MOUSE'] 
['MAPK5_HUMAN'] 

在這種情況下,關鍵是「MAPK5_MOUSE」和值[「MAPK5_HUMAN」]中的某一個

+0

你可以發佈樣本'homolog_dict'詞典嗎? – MaxU

+0

>>> homolog_dict ['MAPK5_MOUSE'] ['MAPK5_HUMAN'] here @ MaxU – user3289556

+0

它看起來不像字典。你可以[在你的問題發佈](https://stackoverflow.com/q/44398932/5741205)? – MaxU

回答

0

能夠通過找到一個解決方案列表這樣做:

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] 

因爲我的字典的值是列表,所以它自己的map函數不會被剪切。此外,我必須定義我自己的函數,因爲如果我無法找到該字典的鍵,map將返回np.nan值,在這些情況下,函數將返回True以用於此任務。