Почему установка мультииндексного фрейма данных с серией дает столбец NaN? - PullRequest
0 голосов
/ 21 сентября 2018

Следующий код иллюстрирует мой вопрос:

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 сделать это.Сублайс имеет те же измерения и даже тот же индекс, что и новые данные, поэтому, хотя я и подозреваю, что это связано с индексированием / выравниванием, я не совсем понимаю, как и почему - я ожидаю, что какДо тех пор, пока вы используете тот же индекс, который вы назначаете, это будет работать нормально.

1 Ответ

0 голосов
/ 21 сентября 2018

Поскольку Pandas выравнивает индексы принимающего информационного кадра и ряда, предоставляющего новые данные.Когда это происходит, он не может найти соответствующий индекс, который ищет.

test_data.loc['100', 'quant2'] имеет запись индекса ('100', '2011-01-01'), в то время как new_data имеет запись '2011-01-01'.Это не одно и то же.

Работа вокруг 1

Используйте атрибут values и пропустите Панд, пытающихся выровнять

test_data.loc['100', 'quant1'] = new_data.values

test_data

                quant1  quant2
100 2011-01-01    11.0     2.0
    2011-01-02    12.0     3.0
    2011-01-03    13.0     NaN
    2011-01-04    14.0     6.0
    2011-01-05    15.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

Работа вокруг 2

Используйте pd.concat для добавления уровня индекса

test_data.loc['100', 'quant1'] = pd.concat({'100': new_data})

test_data

                quant1  quant2
100 2011-01-01    11.0     2.0
    2011-01-02    12.0     3.0
    2011-01-03    13.0     NaN
    2011-01-04    14.0     6.0
    2011-01-05    15.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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...