#python #pandas #random #series
#python #pandas #Случайный #Серии
Вопрос:
Это «проблема недели 53 ISO».
У меня есть экземпляр pandas Series
со значениями индекса, представляющими номер недели ISO:
import pandas as pd
ts = pd.Series([1,1,1,2,3,1,2], index=[1,1,2,2,52,53,53])
Я хочу случайным образом и одинаково заменить все index = 53
индексы на index = 52
или index = 1
.
Для приведенного выше, это может быть:
import pandas as pd
ts = pd.Series([1,1,1,2,3,1,2], index=[1,1,2,2,52,52,1])
или
import pandas as pd
ts = pd.Series([1,1,1,2,3,1,2], index=[1,1,2,2,52,1,52])
например. Как мне это сделать, пожалуйста?
Спасибо за любую помощь.
Редактировать
В numpy я использовал следующее для достижения этого:
from numpy import where
from numpy.random import shuffle
indices = where(timestamps == 53)[0]
number_of_indices = len(indices)
if number_of_indices == 0:
return # no iso week number 53 to fix.
shuffle(indices) # randomly shuffle the indices.
midway_index = number_of_indices // 2
timestamps[indices[midway_index:]] = 52 # precedence if only 1 timestamp.
timestamps[indices[: midway_index]] = 1
где timestamps
массив — это значение pandas index
.
Комментарии:
1. вы говорите о добавлении
.6
к каждому значению?2. @Chris Я переформатировал вопрос. Я думаю, что достаточно просто изменить значение индекса случайным образом.
3. Что здесь означает «случайным образом и поровну»? Вы хотите заменить все
53
значения, половину на1
и половину на52
, и назначенные случайным образом? Что, если существует нечетное число53
значений?4. @KirkBroadhurst Пожалуйста, посмотрите правку о том, как я достиг этого с помощью numpy.
Ответ №1:
Понимание списка должно работать, если я вас правильно понимаю:
ts = pd.Series([1,1,1,2,3,1,2], index=[1,1,2,2,52,53,53])
ts.index = [i if i != 53 else np.random.choice([1,52]) for i in ts.index]
1 1
1 1
2 1
2 2
52 3
52 1
1 2
dtype: int64
Комментарии:
1. Конечно. Поскольку вы работаете с серией, понимание списка должно быть довольно быстрым. Я провел быстрый тест с 1 миллионом строк, и это заняло чуть меньше
300 ms