Как использовать groupby и cumcount для уникальных имен в столбце Pandas - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть кадр данных, который выглядит следующим образом

 ID ..... config_name    config_version  ...  
 aa           A                0         
 ab           A                7
 ad           A                7
 ad           A                27   
 bb           B                0     
 cc           C                0      
 cd           C                8 

Я хочу сгруппировать имя_конфигурации и применить cumcount к каждому уникальному config_version, чтобы я получил дополнительный столбец, например

 ID ..... config_name    config_version     config_version_count 
 aa           A                0                     0        
 ab           A                7                     1
 ad           A                7                     1  
 ad           A                27                    2 
 bb           B                0                     0
 cc           C                0                     0
 cd           C                8                     1

Кажется, я не понимаю, как это сделать.

Я пытался использовать

      unique_count = df.groupby('config_name')['config_version'].cumcount()
      unique_count = pd.DataFrame({'config_name': [unique_count.index], 'config_version_count: [unique.count.values]})
      df = pd.merge(df,unique_count, on = 'config_name' , how = 'left')

, что дает следующий вывод

 ID ..... config_name    config_version     config_version_count 
 aa           A                0                     0        
 ab           A                7                     1
 ad           A                7                     2  
 ad           A                27                    3 
 bb           B                0                     0
 cc           C                0                     0
 cd           C                8                     1

Я также пытался

 unique_count = df.drop_duplicates().groupby('config_name')['config_version'].cumcount()
  unique_count.reindex(df.index).ffill()
  df['config_version_count'] = unique_count

Но это дает тот же результат, что и с первой попытки.

Есть идеи, как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Использование CategoricalIndex с CategoricalIndex.codes:

df['config_version_count'] = (df.groupby('config_name')['config_version']
                                .transform(lambda x: pd.CategoricalIndex(x).codes))

print (df)
   ID config_name  config_version  config_version_count
0  aa           A               0                     0
1  ab           A               7                     1
2  ad           A               7                     1
3  ad           A              27                     2
4  bb           B               0                     0
5  cc           C               0                     0
6  cd           C               8                     1

Ваше решение должно работать:

df['config_version_count'] = (df.drop_duplicates(['config_name','config_version'])
                                .groupby('config_name')
                                .cumcount())
df['config_version_count'] = df['config_version_count'].ffill().astype(int)
0 голосов
/ 25 февраля 2019

Использование pd.factorize()

df['config_version_count']=df.groupby('config_name')['config_version'].\
                                  transform(lambda x: pd.factorize(x)[0])
print(df)

   ID config_name  config_version  config_version_count
0  aa           A               0                     0
1  ab           A               7                     1
2  ad           A               7                     1
3  ad           A              27                     2
4  bb           B               0                     0
5  cc           C               0                     0
6  cd           C               8                     1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...