Столбец (серия) фрейма данных Pandas имеет другой индекс, чем Фрейм данных?

#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