2025, Nov 01 00:46
Как правильно сравнивать столбцы в pandas и получить булев флаг
Разбираем, почему сравнение lag2Open и MGC=F в pandas даёт True во всех строках, и показываем правильные способы: выбор Series, iloc, имена столбцов. Без ошибок
Сравнить два столбца pandas, чтобы получить булев флаг, кажется простым, но крошечная ошибка индексирования может превратить все строки в одно и то же значение. Ниже — краткое объяснение, почему сравнение lag2Open с MGC=F неожиданно дает True для всех строк и как сделать это правильно.
Проблема
Вы хотите сравнить два столбца DataFrame — lag2Open и MGC=F — и сохранить признак того, что первый больше либо равен второму, в новом столбце Higher than 0. Попытка ниже всегда возвращает True, хотя отдельный проверочный столбец (diff) указывает, что это неверно.
df_prices["Higher than 0"] = [df_prices.columns[1]] >= [df_prices.columns[0]]
Что происходит
df_prices.columns[1] и df_prices.columns[0] — это имена столбцов, а не их данные. То есть вы сравниваете метки, а не Series. Поэтому результат не отражает построчные сравнения и получается одинаковым во всем столбце.
Решение
Ссылайтесь на сами Series, а не на метки. Это можно сделать, выбирая столбцы напрямую, по позиции или по их явным именам.
df_prices["Higher than 0"] = df_prices[df_prices.columns[1]] >= df_prices[df_prices.columns[0]]
Или через позиционную индексацию:
df_prices["Higher than 0"] = df_prices.iloc[:, 1] >= df_prices.iloc[:, 0]
Или самый явный вариант — по фактическим именам столбцов:
df_prices["Higher than 0"] = df_prices['lag2Open'] >= df_prices['MGC=F']
Почему это важно
Когда выбор столбца возвращает метку вместо данных, сравнение перестает работать построчно. Результат выглядит синтаксически корректным, но логика оторвана от самих Series. Умение отличать имена столбцов от их данных предотвращает «тихие» столбцы, целиком состоящие из True или False, и экономит время на отладке последующих вычислений.
Вывод
Всегда проверяйте, что сравниваете Series, а не метки. Используйте df[col_name], df.iloc[:, idx] или явный выбор по строковым именам. Если результат подозрительно однороден, перепроверьте, что именно сравнивается, выведя объекты, которые вы передаете в выражение.
Статья основана на вопросе с StackOverflow от Rafael Alexandre Sousa и ответе от user19077881.