【问题标题】:pandas remove rows from dataframe based on multiple conditions without for loops熊猫根据多个条件从数据框中删除行,而不使用 for 循环
【发布时间】:2017-11-07 23:56:01
【问题描述】:

我有一个 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

这是因为我试图用特定行的列值来索引字典。我怎样才能有效地执行此操作?我使用 .itrrrows() 方法实现了它,但是我有超过一百万行,这太慢了。有什么建议?谢谢。

字典如下所示:

homolog_dict['MAPK5_MOUSE']
['MAPK5_HUMAN']

在这种情况下,键是“MAPK5_MOUSE”,值是 ['MAPK5_HUMAN'] 一个列表

【问题讨论】:

  • 你能发布一个样本homolog_dict字典吗?
  • >>> homolog_dict['MAPK5_MOUSE'] ['MAPK5_HUMAN'] 这里@MaxU
  • 它看起来不像字典。可以post it in your question吗?
  • 我编辑了这个问题,希望能说清楚

标签: python python-2.7 pandas dictionary


【解决方案1】:

能够通过这样做找到解决方案:

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 以完成此任务。

【讨论】:

    猜你喜欢
    • 2019-02-26
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    相关资源
    最近更新 更多