我想要处理6列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
删除行的标准仅取决于前两列。我还有一个字典,整个键是前两列中的蛋白质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 :(得分: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将返回np.nan值,在这些情况下,函数将返回True以用于此任务。