【问题标题】:How to use groupby and cumcount on unique names in a Pandas column如何对 Pandas 列中的唯一名称使用 groupby 和 cumcount
【发布时间】:2019-07-18 16:00:36
【问题描述】:

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

 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

但这给出了与第一次尝试相同的输出。

知道我该怎么做吗?

【问题讨论】:

    标签: python pandas dataframe pandas-groupby


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      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)
      

      【讨论】:

      • 有没有办法修改这个解决方案以考虑 NaN 值,这样如果 config_version 值为 NaN,cumcount 函数就不会添加任何内容?
      • @Pleastry - 使用m = df['config_name'].notna(),然后使用df.loc[m, 'config_version_count'] = (df[m].groupby('config_name')['config_version'] .transform(lambda x: pd.CategoricalIndex(x).codes))
      • 哦,这仅适用于“config_version”按升序排序的情况。如果 config_name = "A" 的 config_version 为 [27, 0, ,NaN, 7, 7],则解决方案无效。我会尝试找到解决方案,稍后我会发布我的答案。
      • 实际上,您的解决方案的第二部分,即对 OP 解决方案的修改,似乎在这种情况下有效。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 2017-05-15
      • 1970-01-01
      相关资源
      最近更新 更多