Назначьте случайные значения в столбце панд пропорционально по группам - PullRequest
0 голосов
/ 04 октября 2018

df фрейм данных, подобный этому:

ID   Category   Result
1     A          ...
2     B          ...
3     B          ...
4     C          ...

Везде, где категория A, в них присваивают три значения результата (Pass, Fail, Hold) в случайном порядке, учитывая пропорцию 30,40,30.для каждого типа результата.Аналогично для других категорий с разными пропорциями.Есть ли быстрый способ сделать это?

В настоящее время я использую

np.split(df[cond],int([.3*len(df[cond])]),int([.7*len(df[cond])]))

, чтобы разделить данные на пропорции, а затем

df1[Result] = 'Pass'
df2[Result] = 'Fail'...
pd.concat([df1,df2,...all conditioned columns frames])

, чтобы получить полный набор.

1 Ответ

0 голосов
/ 04 октября 2018

Вот идея.Вы можете использовать GroupBy с np.random.choice.

Это не гарантирует сохранения ваших пропорций.Например, если у вас есть только одна строка для конкретной категории, это не может гарантировать, что ваши пропорции сохраняются, если все ваши веса отличны от нуля.Даже если они могут быть сохранены, логика по-прежнему использует "случайные" числа для выбора каждого значения.Что вы можете сказать , используя этот метод, так это то, что если число строк стремится к бесконечности, отношения будут стремиться к предоставленным весам.

values = ['Pass', 'Fail', 'Hold']
weights = {'A': [0.3, 0.4, 0.3], 'B': [0.6, 0.2, 0.2]}

df = pd.DataFrame({'Category': list('A'*10 + 'B'*5)})

np.random.seed(0)

def apply_randoms(x):
    key = x['Category'].iat[0]
    return pd.Series(np.random.choice(values, size=len(x), p=weights[key]))

df = df.groupby('Category').apply(apply_randoms)\
       .rename('Result').reset_index().drop('level_1', 1)

print(df)

   Category Result
0         A   Hold
1         A   Fail
2         A   Fail
3         A   Hold
4         A   Pass
5         A   Pass
6         A   Pass
7         A   Hold
8         A   Hold
9         A   Hold
10        B   Hold
11        B   Fail
12        B   Pass
13        B   Fail
14        B   Pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...