У меня есть 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
не совпадают.
но это бросает и ошибается. Каков правильный способ сделать это?
С 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]
Может быть это
df.loc[((df['group']==df['treatment'])|(df['landing_page']==df['old_page']))&((df['group']==df['control'])|(df['landing_page']==df['new_page']))]