代码之家  ›  专栏  ›  技术社区  ›  Nickpick

通过内省行中的每个元素来筛选熊猫数据帧

  •  2
  • Nickpick  · 技术社区  · 6 年前

    我有一个数据帧,它在列中包含一个对象。

    例如:

    df['id_original'].iloc[0].Class
    Out[20]: u'Classtype1'
    
    df['id_original'].iloc[1].Class
    Out[20]: u'Classtype2'
    

    如何筛选仅获取行“id_original”包含属性类为classtype1的对象的数据帧。或者更好。与 .isin(allowed_class_type_list) ?

    有没有任何方法可以用.isin来实现这一点,或者我必须用iterrow遍历所有行吗?最好采用优雅的单线解决方案。

    2 回复  |  直到 6 年前
        1
  •  3
  •   harvpan    6 年前

    您可以使用:

    df.loc[df['id_original'].apply(lambda x: x.Class in allowed_class_type_list)]
    

    请考虑下面的小型示例:

    class Example:
        def __init__(self, class_):
            self.Class = class_
    
    ex1 = Example('class1')
    ex2 = Example('class2')
    ex3 = Example('class3')
    ex4 = Example('class4')
    
    df = pd.DataFrame({
        'id_original':[ex1, ex2, ex2, ex1, ex4, ex3, ex3, ex4]
    })
    
    allowed_class_type_list = ['class1', 'class4']
    

    您可以使用以下选项进行筛选:

    df.loc[df['id_original']应用(lambda x:x.类在允许的_class_type_列表中)]
    

    输出:

                       id_original
    0   <__main__.Example object at 0x000000000A597390>
    3   <__main__.Example object at 0x000000000A597390>
    4   <__main__.Example object at 0x000000000A597B00>
    7   <__main__.Example object at 0x000000000A597B00>
    
        2
  •  0
  •   shanmuga    6 年前

    你为什么不试试呢 apply 获取一系列真/假并将其用作数据帧上的掩码

    mask = df['id_original'].apply(lambda x: x.Class in allowed_class_list)
    df.loc[mask]
    

    同一逻辑位清洗器

    mask = df['id_original'].apply(lambda x: x.Class).isin(allowed_class_list)
    df.loc[mask]