Поиск строк, в которых два столбца вместе не равны заранее заданным значениям

1

У меня есть dataframe, что я пытаюсь найти строки, в которых два столбца вместе не совпадают.

Например, column:landing_page может равняться new_page или old_page и column: group может равняться control или treatment. В настоящее время я использую

no_line_up = df.query('group = treatment and landing_page = old_page or group = control and landing_page = new_page')

Я пытаюсь найти строки, где new_page и treatment не совпадают.

но это бросает и ошибается. Каков правильный способ сделать это?

Теги:
pandas
dataframe
indexing

2 ответа

1
Лучший ответ

С pd.DataFrame.query вам все равно нужно использовать одни и те же базовые операторы, например, использовать == для проверки равенства и использовать круглые скобки для разделения условий:

df = pd.DataFrame({'group': ['treatment', 'control', 'hello'],
                   'landing_page': ['old_page', 'new_page', 'test']})

res = df.query('(group == "treatment" and landing_page == "old_page") \
                 or (group == "control" and landing_page == "new_page")')

print(res)

       group landing_page
0  treatment     old_page
1    control     new_page

Более читаемым является объединение булевых масок и использование pd.DataFrame.loc:

m1 = (df['group'] == 'treatment') & (df['landing_page'] == 'old_page')
m2 = (df['group'] == 'control') & (df['landing_page'] == 'new_page')

res = df.loc[m1 & m2]
  • 1
    Спасибо за объяснение!
0

Может быть это

df.loc[((df['group']==df['treatment'])|(df['landing_page']==df['old_page']))&((df['group']==df['control'])|(df['landing_page']==df['new_page']))]
  • 0
    Спасибо! Тем не менее, group и landing_page являются столбцами old_page, new_page принадлежат столбцу Landing_page. Лечение и контроль относятся к группе столбца. Из-за этого выдает ошибку.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню