【问题标题】:Filtering pandas dataframe by introspecting each element of a row通过内省行的每个元素来过滤熊猫数据框
【发布时间】:2018-11-23 04:36:56
【问题描述】:

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

例如:

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 实现这一点,还是我必须用 iterrows 遍历所有行?首选优雅的单行解决方案。

【问题讨论】:

  • 它们是字符串吗?这是你想要的df[df['id_original'].isin(['Classtype1'])]吗?

标签: python pandas filtering series


【解决方案1】:

你为什么不尝试apply 来获取一系列 True/False 并将其用作数据帧上的掩码

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]

【讨论】:

    【解决方案2】:

    你可以使用:

    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'].apply(lambda x: x.Class in allowed_class_type_list)]
    

    输出:

                       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>
    

    【讨论】:

      猜你喜欢
      • 2018-04-04
      • 1970-01-01
      • 2017-05-18
      • 2019-05-21
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-21
      相关资源
      最近更新 更多