Случайным образом разбить переменные на группы по определенному числу - PullRequest
1 голос
/ 05 августа 2020

У меня есть большой pandas фрейм данных, в котором я пытаюсь случайным образом разбить объекты на группы по определенному числу. Например, я пытаюсь разбить указанные ниже object на группы по 3. Однако группы должны быть из одного type. Вот набор данных игрушки:

type     object       index

ball     soccer       1
ball     soccer       2
ball     basket       1
ball     bouncy       1
ball     tennis       1
ball     tennis       2
chair    office       1
chair    office       2
chair    office       3
chair    lounge       1
chair    dining       1
chair    dining       2
...      ...          ...     

Желаемый результат:

type     object       index    group

ball     soccer       1        ball_1
ball     soccer       2        ball_1
ball     basket       1        ball_1
ball     bouncy       1        ball_1
ball     tennis       1        ball_2
ball     tennis       2        ball_2
chair    office       1        chair_1
chair    office       2        chair_1
chair    office       3        chair_1
chair    lounge       1        chair_1
chair    dining       1        chair_1
chair    dining       2        chair_1
...      ...          ...      ...

Итак, здесь группа ball_1 содержит 3 уникальных объекта одного типа: soccer, basket и bouncy. Остающийся объект попадает в группу ball_2, в которой есть только 1 объект. Поскольку фрейм данных такой большой, я надеюсь на длинный список групп, содержащих 3 объекта и одну группу, содержащую остальные объекты (меньше 3).

Опять же, хотя мой пример содержит только несколько объектов, я надеюсь, что объекты будут случайным образом отсортированы по группам по 3. (Мой настоящий набор данных будет содержать гораздо больше мячей и стульев.)

Это казалось полезным, но я еще не понял, как это применить: Как разделить список на части одинакового размера?

1 Ответ

0 голосов
/ 05 августа 2020

Если необходимо разделить для каждого N значений на группы на type, можно использовать factorize с GroupBy.transform, целочисленное разделение и сложение 1, последнее добавить столбец type в Series.str.cat:

N = 3
g = df.groupby('type')['object'].transform(lambda x: pd.factorize(x)[0]) // N + 1

df['group'] = df['type'].str.cat(g.astype(str), '_')
print (df)
     type  object  index    group
0    ball  soccer      1   ball_1
1    ball  soccer      2   ball_1
2    ball  basket      1   ball_1
3    ball  bouncy      1   ball_1
4    ball  tennis      1   ball_2
5    ball  tennis      2   ball_2
6   chair  office      1  chair_1
7   chair  office      2  chair_1
8   chair  office      3  chair_1
9   chair  lounge      1  chair_1
10  chair  dining      1  chair_1

При необходимости также добавить некоторые случайные значения DataFrame.sample:

N = 3
df = df.sample(frac=1)
g = df.groupby('type')['object'].transform(lambda x: pd.factorize(x)[0]) // N + 1

df['group'] = df['type'].str.cat(g.astype(str), '_')
print (df)
     type  object  index    group
10  chair  dining      1  chair_1
8   chair  office      3  chair_1
2    ball  basket      1   ball_1
1    ball  soccer      2   ball_1
7   chair  office      2  chair_1
0    ball  soccer      1   ball_1
9   chair  lounge      1  chair_1
4    ball  tennis      1   ball_1
6   chair  office      1  chair_1
3    ball  bouncy      1   ball_2
5    ball  tennis      2   ball_1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...