Python: категориальные серии панд с перерывами индексации по времени и времени при попытке изменить значения (ValueError) - PullRequest
0 голосов
/ 24 октября 2018

(я использую pandas версии 0.23.4 на Python 3.6.6)

У меня есть серия Pandas с индексом datetime, который содержит категориальные данные.

my_range = pd.date_range("2018-01-01", "2018-01-05", freq="D")
my_series = pd.Series(data=pd.Categorical(values=["a", "b", "c", "a", "b"], categories=["a", "b", "c", "d", "e"]),
                      index=my_range)
print(my_series)

Это выглядитнапример:

2018-01-01    a
2018-01-02    b
2018-01-03    c
2018-01-04    a
2018-01-05    b
Freq: D, dtype: category
Categories (5, object): [a, b, c, d, e]

Я могу получить доступ к значениям путем индексации со строками, которые соответствуют датам:

print(my_series["2018-01-03"])

Выходы:

c

Я могу изменитьзначения путем обычной индексации:

my_series[0] = "d"
print(my_series)

Выходы:

2018-01-01    d
2018-01-02    b
2018-01-03    c
2018-01-04    a
2018-01-05    b
Freq: D, dtype: category
Categories (5, object): [a, b, c, d, e]

Но когда я пытаюсь изменить значения путем индексации со строкой datetime, он не работает и выдает ошибку ValueError:

my_series["2018-01-03"] = "b"

Выходы:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-41-48f5e1a05df9> in <module>
      1 print(my_series["2018-01-03"])
----> 2 my_series["2018-01-03"] = "b"

D:\Anaconda3\lib\site-packages\pandas\core\series.py in __setitem__(self, key, value)
    937         # do the setitem
    938         cacher_needs_updating = self._check_is_chained_assignment_possible()
--> 939         setitem(key, value)
    940         if cacher_needs_updating:
    941             self._maybe_update_cacher()

D:\Anaconda3\lib\site-packages\pandas\core\series.py in setitem(key, value)
    933                     pass
    934 
--> 935             self._set_with(key, value)
    936 
    937         # do the setitem

D:\Anaconda3\lib\site-packages\pandas\core\series.py in _set_with(self, key, value)
    981                 self._set_values(key.astype(np.bool_), value)
    982             else:
--> 983                 self._set_labels(key, value)
    984 
    985     def _set_labels(self, key, value):

D:\Anaconda3\lib\site-packages\pandas\core\series.py in _set_labels(self, key, value)
    991         mask = indexer == -1
    992         if mask.any():
--> 993             raise ValueError('%s not contained in the index' % str(key[mask]))
    994         self._set_values(indexer, value)
    995 

ValueError: ['2' '0' '1' '8' '-' '0' '1' '-' '0' '3'] not contained in the index

Однако при типе данных числового, а не категориального типа такой проблемы не возникает:

new_series = pd.Series(data=[10, 11, 12, 13, 14], index=my_range)
new_series["2018-01-03"] = 20
print(new_series)

Выходы:

2018-01-01    10
2018-01-02    11
2018-01-03    20
2018-01-04    13
2018-01-05    14
Freq: D, dtype: int64

Почему происходит сбой при категориальном типе данных?

...