【问题标题】:cumulative number of unique elements for pandas dataframe熊猫数据框的唯一元素的累积数量
【发布时间】:2015-07-28 19:24:57
【问题描述】:

我有一个熊猫数据框

id tag
1  A
1  A
1  B
1  C
1  A
2  B
2  C  
2  B 

我想添加一个列来计算 id 级别的唯一标签的累积数量。更具体地说,我想拥有

id tag count
1  A   1
1  A   1
1  B   2
1  C   3
1  A   3
2  B   1
2  C   2
2  B   2

对于给定的 id,计数不会减少。谢谢你的帮助!

【问题讨论】:

  • 查看我的编辑。这仅适用于按id 排序的情况

标签: python pandas unique


【解决方案1】:

我认为这是你想要的:

unique_count = df.drop_duplicates().groupby('id').cumcount() + 1
unique_count.reindex(df.index).ffill()

+1 是因为计数从零开始。这仅在数据帧按id 排序时才有效。这是故意的吗?您始终可以预先进行排序。

【讨论】:

    【解决方案2】:

    您可以在 R 和 Python here找到其他一些方法

    df = pd.DataFrame({'id':[1,1,1,1,1,2,2,2],'tag':["A","A", "B","C","A","B","C","B"]})
    
    df['count']=df.groupby('id')['tag'].apply(lambda x: (~pd.Series(x).duplicated()).cumsum())
    
       id tag  count
    0   1   A      1
    1   1   A      1
    2   1   B      2
    3   1   C      3
    4   1   A      3
    5   2   B      1
    6   2   C      2
    7   2   B      2
    

    【讨论】:

      【解决方案3】:

      这个怎么样:

      d['X'] = 1
      d.groupby("Col").X.cumsum()
      

      【讨论】:

        【解决方案4】:
        idt=[1,1,1,1,1,2,2,2]
        tag=['A','A','B','C','A','B','C','B']
        df=pd.DataFrame(tag,index=idt,columns=['tag'])
        df=df.reset_index()
        print(df)
        
           index tag
        0      1   A
        1      1   A
        2      1   B
        3      1   C
        4      1   A
        5      2   B
        6      2   C
        7      2   B
        
        
        df['uCnt']=df.groupby(['index','tag']).cumcount()+1
        print(df)
        
           index tag  uCnt
        0      1   A     1
        1      1   A     2
        2      1   B     1
        3      1   C     1
        4      1   A     3
        5      2   B     1
        6      2   C     1
        7      2   B     2
        
        
        df['uCnt']=df['uCnt']//df['uCnt']**2
        print(df)
        
           index tag  uCnt
        0      1   A     1
        1      1   A     0
        2      1   B     1
        3      1   C     1
        4      1   A     0
        5      2   B     1
        6      2   C     1
        7      2   B     0
        
        df['uCnt']=df.groupby(['index'])['uCnt'].cumsum()
        print(df)
        
           index tag  uCnt
        0      1   A     1
        1      1   A     1
        2      1   B     2
        3      1   C     3
        4      1   A     3
        5      2   B     1
        6      2   C     2
        7      2   B     2
        
        df=df.set_index('index')
        print(df)
              tag  uCnt
        index          
        1       A     1
        1       A     1
        1       B     2
        1       C     3
        1       A     3
        2       B     1
        2       C     2
        2       B     2
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-10-11
          • 2014-10-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多