Я пытаюсь понять индексацию представления-копии-копии в пандас-фреймах данных и столкнулся с этим странным поведением.
Ниже приведено то, что я пытался из примера :
import pandas as pd
dfmi = pd.DataFrame([list('abcd'),
list('efgh'),
list('ijkl'),
list('mnop')],
columns=pd.MultiIndex.from_product([['one', 'two'],
['first',
'second']]))
Итак, dfmi
имеет исходное значение:
one two
first second first second
0 a b c d
1 e f g h
2 i j k l
3 m n o p
Теперь приходит мой сценарий:
df = dfmi['one']['second'] # view or copy?
df['one'] = 2 # If commenting out this line, original dfmi gets updated!
df[2] = 5
Поведение df
сбивает с толку:
Если я запусту вышеуказанный скрипт в блокноте jupyter как есть, значение dfmi
не изменится вообще. И он генерирует предупреждение SettingWithCopyWarning
.
Если я закомментирую вторую последнюю строку, dfmi
изменится на:
one two
first second first second
0 a b c d
1 e f g h
2 i 5 k l <= updated row !!
3 m n o p
Мой вопрос:
- Когда я делаю
df = dfmi['one']['second'] # view or copy?
это просмотр или копирование?
Что меняется незаметно, когда я делаю:
df['one'] = 2
df[2] = 5
и почему это повлияет на вторую строку?
Это связано с тем, как я получаю доступ к df по целочисленному индексу?