(я использую 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
Почему происходит сбой при категориальном типе данных?