Фильтрация Dataframe с использованием словаря с несколькими элементами - PullRequest
0 голосов
/ 09 октября 2018

Я уже несколько часов пытаюсь найти ответ, но не могу заставить его работать в моем конкретном случае.Самое близкое, что я мог найти, было это: Применение нескольких фильтров для хранения строк к кадру данных панд с использованием словаря

У меня есть pd.Dataframe цен сделок со следующими столбцами:

df1 = database[['DealID',
         'Price',
         'Attribute A',
         'Attribute B',
         'Attribute C']]

Атрибуты подразделяются на следующие:

filter_options = {
    'Attribute A': ["A1","A2","A3","A4"],
    'Attribute B': ["B1","B2","B3","B4"],
    'Attribute C': ["C1","C2","C3"],
}

Я хочу отфильтровать df1, используя подмножество filter_options, которое имеет несколько значений на ключ:

filter = {
    'Attribute A': ["A1","A2"],
    'Attribute B': ["B1"],
    'Attribute C': ["C1","C3"],
}

Приведенное ниже прекрасно работает, когда в словаре имеется только одно значение для ключа.

df_filtered = df1.loc[(df1[list(filter)] == pd.Series(filter)).all(axis=1)]

Однако могу ли я получить один и тот же результат с несколькими значениями на ключ?

Спасибо!

1 Ответ

0 голосов
/ 09 октября 2018

Я считаю, что вам нужно изменить переменную filter, потому что python зарезервировано слово, а затем используйте list comprehension с isin и concat для логической маски:

df1 = pd.DataFrame({'Attribute A':["A1","A2"],
                    'Attribute B':["B1","B2"],
                    'Attribute C':["C1","C2"],
                    'Price':[140,250]})

filt = {
    'Attribute A': ["A1","A2"],
    'Attribute B': ["B1"],
    'Attribute C': ["C1","C3"],
}

print (df1[list(filt)])
  Attribute A Attribute B Attribute C
0          A1          B1          C1
1          A2          B2          C2

mask = pd.concat([df1[k].isin(v) for k, v in filt.items()], axis=1).all(axis=1)
print (mask)
0     True
1    False
dtype: bool

df_filtered = df1[mask]
print (df_filtered)
  Attribute A Attribute B Attribute C  Price
0          A1          B1          C1    140
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...