Панды: случайное распределение значений индекса между двумя значениями индекса - PullRequest
3 голосов
/ 12 марта 2019

Это «проблема недели ISO 53».

У меня есть экземпляр 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 - это значение панды index.

1 Ответ

2 голосов
/ 12 марта 2019

Понимание списка должно работать, если я вас правильно понимаю:

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
...