Как я могу создать новый столбец, содержащий значения 0 и 1, с помощью groupby(«col1»)?

#python #pandas #dataframe #group-by

Вопрос:

У меня есть фрейм данных, подобный этому:

 df = pd.DataFrame({"col1":["a","a","a","b","b","c","c","c","c","d"]})
 

Как я могу создать новый столбец, содержащий значения 0 и 1, с помощью groupby(«col1») ?

   col1 col2
0   a   0
1   a   0
2   a   0
3   b   1
4   b   1
5   c   0
6   c   0
7   c   0
8   c   0
9   d   1
 

Ответ №1:

Вы можете groupby col1 и взять оставшуюся часть номера группы, разделенную на 2:

 df['col2'] = df.groupby('col1', sort=False).ngroup()%2
 

выход:

   col1  col2
0    a     0
1    a     0
2    a     0
3    b     1
4    b     1
5    c     0
6    c     0
7    c     0
8    c     0
9    d     1
 

Альтернативная форма:

 df['col2'] = df.groupby('col1', sort=False).ngroup().mod(2)
 

И в случае, если вы хотите, чтобы нечетные группы были 1, а четные-0:

 df['col2'] = df.groupby('col1', sort=False).ngroup().add(1).mod(2)
 

Комментарии:

1. Я думаю, что вам нужно пройти sort=False в groupby

2. Правильно! Иногда мне хочется, чтобы эта опция была по умолчанию!

Ответ №2:

Без групповых попыток factorize

 df['new'] = df.col1.factorize()[0]%2
df
Out[151]: 
  col1  new
0    a    0
1    a    0
2    a    0
3    b    1
4    b    1
5    c    0
6    c    0
7    c    0
8    c    0
9    d    1
 

Или попробуйте с

 from itertools import cycle
df['new'] = df.col1.map(dict(zip(df.col1.unique(), cycle([0,1]))))
df
Out[155]: 
  col1  new
0    a    0
1    a    0
2    a    0
3    b    1
4    b    1
5    c    0
6    c    0
7    c    0
8    c    0
9    d    1
 

Комментарии:

1. Отлично, я не мог вспомнить название factorize метода!

2. @mozway также классифицировал , но порядок может отличаться ~

Ответ №3:

[Похоже, в вопросе спрашивалось о том, чтобы пометить каждую другую группу 0/1; это было неясно с начальной формулировки вопроса, поэтому этот ответ, возможно, кажется чрезмерно упрощенным.]

Проверьте, является ли col1 это или b или d , и преобразуйте логическое True значение / False в целое число:

 df = pd.DataFrame({"col1":["a","a","a","b","b","c","c","c","c","d"]})

df['col2'] = df['col1'].isin(['b','d']).astype(int)
 
   col1  col2
0    a     0
1    a     0
2    a     0
3    b     1
4    b     1
5    c     0
6    c     0
7    c     0
8    c     0
9    d     1