Следующий код иллюстрирует мой вопрос:
In [2]: idx = pd.date_range('1/1/2011', periods=5)
In [3]: idx
Out[3]:
DatetimeIndex(['2011-01-01', '2011-01-02', '2011-01-03', '2011-01-04', '2011-01-05'],
dtype='datetime64[ns]', freq='D')
In [4]: midx = pd.MultiIndex.from_product([['100', '200'], idx])
In [5]: midx
Out[5]: MultiIndex(levels=[['100', '200'],
[2011-01-01 00:00:00, 2011-01-02 00:00:00, 2011-01-03 00:00:00, 2011-01-04 00:00:00, 2011-01-05 00:00:00]],
labels=[[0, 0, 0, 0, 0, 1, 1, 1, 1, 1], [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]])
In [6]: test_data = pd.DataFrame(
2*[[1, 2], [NaN, 3], [4, NaN], [5, 6], [7, 8]],
index=midx, columns=['quant1', 'quant2']
)
In [7]: test_data
Out[7]:
quant1 quant2
100 2011-01-01 1.0 2.0
2011-01-02 NaN 3.0
2011-01-03 4.0 NaN
2011-01-04 5.0 6.0
2011-01-05 7.0 8.0
200 2011-01-01 1.0 2.0
2011-01-02 NaN 3.0
2011-01-03 4.0 NaN
2011-01-04 5.0 6.0
2011-01-05 7.0 8.0
In [8]: new_data = pd.DataFrame([11, 12, 13, 14, 15], index=idx, columns=['quant1'])
In [9]: new_data
Out[9]:
quant1
2011-01-01 11
2011-01-02 12
2011-01-03 13
2011-01-04 14
2011-01-05 15
In [10]: test_data.loc['100', 'quant1'] = new_data
In [11]: test_data
Out[11]:
quant1 quant2
100 2011-01-01 NaN 2.0
2011-01-02 NaN 3.0
2011-01-03 NaN NaN
2011-01-04 NaN 6.0
2011-01-05 NaN 8.0
200 2011-01-01 1.0 2.0
2011-01-02 NaN 3.0
2011-01-03 4.0 NaN
2011-01-04 5.0 6.0
2011-01-05 7.0 8.0
Почему сегмент данных ['100', 'quant1']
заполнен NaN
s вместо чисел из new_data
?
У меня естьобнаружил, что использование
test_data.loc['100', 'quant1'] = new_data.values
работает, но я хотел бы понять, что заставляет Pandas
сделать это.Сублайс имеет те же измерения и даже тот же индекс, что и новые данные, поэтому, хотя я и подозреваю, что это связано с индексированием / выравниванием, я не совсем понимаю, как и почему - я ожидаю, что какДо тех пор, пока вы используете тот же индекс, который вы назначаете, это будет работать нормально.