Фильтровать информационный кадр по значению, только если значение не является конкретным значением - PullRequest
0 голосов
/ 05 января 2019

Я хочу отфильтровать кадр данных по значениям, полученным в JSON, как показано ниже:

region = request_json['region_value']
ma = request_json['ma_value']
market = request_json['market_value']
subsegment = request_json['subsegment_value']

filtered =df[
    (df['Region'] == region) &
    (df['MA/Segment'] == ma) &
    (df['Market'] == market) &
    (df['Subsegment'] == subsegment)
]

Однако, если region, ma, market или subsegment равно 'All', я не хочу включать его в фильтрацию.

Так, например, если region = 'All', код должен выглядеть следующим образом:

filtered =df[
        (df['MA/Segment'] == ma) &
        (df['Market'] == market) &
        (df['Subsegment'] == subsegment)
    ]

Я бы хотел избежать нескольких ifs и вместо этого перейти к более элегантному решению. Буду рад любым идеям.

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Делай с sum

mask=((df['Region'] == region) +
      (df['MA/Segment'] == ma) +
      (df['Market'] == market) +
      (df['Subsegment'] == subsegment)).sum(axis=1).eq(3)

df=df[mask]
0 голосов
/ 05 января 2019

Вы можете использовать np.logical_and.reduce; это будет работать, даже если в именах ваших столбцов есть пробелы, специальные символы и т. д .:

conditions = {
    'Region': region, 'MA/Segment': ma, 'Market': market, 'Subsegment': subsegment}

mask = pd.np.logical_and.reduce([
    df[k] == v for k, v in conditions.items() if v != 'All'])
df[mask]

Другой вариант - query, но он будет работать при условии, что имена ваших столбцов соответствуют действительным именам идентификаторов python.

query = ' and '.join([
    f'{k}=={repr(v)}' for k, v in conditions.items() if v != 'All'])    
df.query(query) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...