Читая документы, с которыми вы так хорошо связаны, мы находим следующее:
ось: {0, 1, «индекс», «столбцы»}
Для ввода серий: ось, совпадающая с индексом серии на
И значением по умолчанию является 'columns'
. Это дает нам подсказку о том, что происходит, когда вы делаете вычитание, т. Е .:
df.sub(s) # by not specifying axis you are passing axis=1 / 'columns'
или
df - s
Ничто из этого не будет работать так, как вы хотите. Теперь давайте вернемся к желтому полю. Другая альтернатива - 'index'
, и мы соответствовали бы индексу (который звучит в точности так, как вы ожидаете), то есть: * 10101 *
df.sub(s, axis=0) # or 'index' <-- note that you pass a param here
или
(df.T - s).T #swap columns and rows and swap back again (transpose)
Почему? Это вопрос дизайна. Разработчики могли бы также установить 'index'
по умолчанию, но по неизвестным причинам (и, вероятно, потому, что он используется чаще, и что базовый пакет за пандами, numpy, работает таким образом), они выбрали columns
. Поведение numpy легко проверяется следующим образом: df.values - s.values
, который действительно работает со столбцами, где вас интересуют строки (индекс).
Коротко почему: numpy работает так.
Наиболее элегантным решением для этого является использование .sub()
и указание axis='index'
. (или 0, но индекс может быть более читабельным в этом случае)