Pandas: случайное разделение значений индекса между двумя значениями индекса

#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