#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
в groupby2. Правильно! Иногда мне хочется, чтобы эта опция была по умолчанию!
Ответ №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