如何在熊猫列中的唯一名称上使用groupby和cumcount

时间:2019-02-25 09:25:07

标签: python pandas dataframe pandas-groupby

我有一个看起来像这样的数据框

 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 

我想对config_name进行分组并在每个唯一的config_version上应用cumcount,以便获得诸如

的附加列
 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 :(得分:4)

CategoricalIndexCategoricalIndex.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)

答案 1 :(得分:1)

使用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