Генерация двух разных случайных выборок на основе набора условий в кадре данных - PullRequest
0 голосов
/ 15 сентября 2018

У меня есть датафрейм, который выглядит так:

      Date       Day
1     y-m-d      MON
2     y-m-d      TUE
3     y-m-d      WED
...

Вы можете воссоздать это:

dict_weekday = {1: 'MON', 2: 'TUE', 3: 'WED', 4: 'THU', 5: 'FRI', 6: 'SAT', 7: 'SUN'}

df = pd.DataFrame(pd.date_range(datetime.date(2018, 1, 1), 
datetime.date(2019, 1, 1), freq='D'),   columns=['Date'])

df['Day'] = df['Date'].apply(lambda x: dict_weekday[x.isoweekday()])

Как мне создать новый столбец, который использует np.random.poisson(30) MON-FRI, но затем использует np.random.poisson(1) для SAT & SUN?

На данный момент я пытаюсь использовать np.select для выполнения моих условий и выбора:

conditions = [
    (df['Day'] == 'SAT'),
    (df['Day'] == 'SUN')
]
choices = [np.random.poisson(1), np.random.poisson(1)] #I wish this part was cleaner

for index, row in df.iterrows():
    df['New'] = np.select(conditions, choices, default = np.random.poisson(30)

Код выше приведен в другом посте:

Pandas условное создание столбца серии / кадра данных

... и это очень близко, но я не знаю, как сохранить целостность индекса при циклическом цикле, я думаю, в чем проблема (?). Вот что я получаю:

      Date       Day    New 
1     y-m-d      MON    34
2     y-m-d      TUE    34
3     y-m-d      WED    34
...
6     y-m-d      SAT    2
7     y-m-d      SUN    1
8     y-m-d      MON    34
9     y-m-d      TUE    34
10    y-m-d      WED    34

Я хочу, чтобы New был массивом чисел, случайно сгенерированным из распределения Пуассона. С понедельника по пятницу следует то же распределение, но числа субботы и воскресенья значительно меньше. Я думаю, что понимаю, почему мой код не моделирует то, что я хочу, но у меня нет опыта, чтобы знать, как это исправить.

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

Надеюсь, все это имеет смысл ... это мой первый пост, поэтому я прошу прощения заранее, если я не следую ТАК передовым методам.

1 Ответ

0 голосов
/ 15 сентября 2018

Вы можете использовать numpy.where в этом состоянии.

import numpy as np
...
df['New'] = np.where(df['Day'].isin(['SAT','SUN']), 1, 34)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...