#python #pandas #dataframe #indexing #series
Вопрос:
Рассмотрим этот небольшой скрипт:
import pandas as pd
aa = pd.DataFrame({'a': [1,2,3]})
bb = aa.a
bb.index = bb.index 1
aa['b'] = bb
print(aa)
print(aa.a - aa.b)
на выходе получается:
a b
0 1 NaN
1 2 1.0
2 3 2.0
0 NaN
1 0.0
2 0.0
3 NaN
в то время как я ожидал aa.a - aa.b
, что буду
0 NaN
1 1.0
2 1.0
Как это возможно? Это ошибка Панды?
Комментарии:
1. Достаточно интересно,
aa.index
иaa.a.index
они разные. Похоже, панды запутались, заменив индексы ссылок (вbb.index = bb.index 1
).2. Точно. Является ли это предполагаемым поведением (могу ли я найти место, где это задокументировано?) или это ошибка?
Ответ №1:
aa = pd.DataFrame({'a': [1,2,3]})
bb = aa.a
bb.index = bb.index 1
aa['b'] = bb
aa.reset_index(drop=True) # add this
ваш индекс не совпадает.
Комментарии:
1. Итак, каждый столбец фрейма данных запоминает свой собственный индекс и не предполагает индекс фрейма данных? Это очень нелогично для меня
Ответ №2:
Когда вы это делаете aa.b - aa.a
, вы вычитаете 2 pandas.Series
, имеющие одинаковую длину, но не одинаковый индекс :
aa.a
1 1
2 2
3 3
Name: a, dtype: int64
Где как:
aa.b
0 NaN
1 1.0
2 2.0
Name: b, dtype: float64
И когда ты это сделаешь :
print(aa.b - aa.a)
вы печатаете слияние этих 2 pandas.Series
(независимо от типа операции : сложение или вычитание), и именно поэтому индексы [0,1,2]
и [1,2,3]
будут объединены в новый индекс от 0 до 3 : [0,1,2,3].
И, например, если вы сдвинете 2 своих bb.index
вместо 1:
bb.index = bb.index 2
в этот раз у вас будет 5 строк в вашем новом pandas.Series
вместо 4. И так далее..
bb.index = bb.index 2
aa['b'] = bb
print(aa.a - aa.b)
0 NaN
1 NaN
2 0.0
3 NaN
4 NaN
dtype: float64