Фильтрация pandas dataframe путем анализа каждого элемента строки - PullRequest
0 голосов
/ 13 июня 2018

У меня есть фрейм данных, который содержит объект в столбце.

например:

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

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

Как я могу отфильтровать фрейм данных, чтобы я получал только те строки, где строка 'id_original' содержит объекты со свойством Class of Classtype1.Или даже лучше.в сочетании с .isin(allowed_class_type_list)?

Есть ли способ достичь этого с помощью .isin или мне придется перебирать все строки с помощью iterrows?Предпочтительнее элегантное однострочное решение.

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Вы можете использовать:

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>
0 голосов
/ 13 июня 2018

Почему бы вам не попробовать 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]
...