Группировать и последовательно преобразовывать другой столбец - PullRequest
2 голосов
/ 14 июля 2020

У меня есть этот фрейм данных

df1 = pd.DataFrame(data = {'id':[1,1,1,1,2,2,3],'task':[12,32,12,54,64,21,52]})

Я хочу сгруппировать по id и изменить task значения соответственно, как это

   id  task
0  1   1A   
1  1   2A   
2  1   3A   
3  1   4A   
4  2   1B   
5  2   2B   
6  3   1C

Я сделал это до сих пор

df1['task']=df1.groupby('id')['task'].transform(lambda x : x.factorize()[0]+1)   

Что дает мне

   id  task
0  1   1   
1  1   2   
2  1   1   
3  1   3   
4  2   1   
5  2   2   
6  3   1   

Как я могу получить алфавиты и, во-вторых, почему в id 1 последовательность задач 1213, а не 1234?

1 Ответ

5 голосов
/ 14 июля 2020
(df1.groupby('id').cumcount().add(1).astype(str)   # digit
 + df1['id'].add(ord('A') - 1).map(chr))           # letter

0    1A
1    2A
2    3A
3    4A
4    1B
5    2B
6    1C
dtype: object

Есть две штуки - ди git и буква. Постройте каждую отдельно. Во-первых, цифры. Ваш код можно сократить до GroupBy.cumcount. Наконец, преобразуйте этот результат в строку, чтобы мы могли объединить его с буквой позже.

df1.groupby('id').cumcount().add(1).astype(str)

0    1
1    2
2    3
3    4
4    1
5    2
6    1
dtype: object

Это получает букву для группы.

df1['id'].add(ord('A') - 1).map(chr)

0    A
1    A
2    A
3    A
4    B
5    B
6    C
Name: id, dtype: object

Наконец, добавьте посредников, чтобы получить ваш окончательный результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...