【问题标题】:Pandas number rows within group in increasing orderPandas 按递增顺序编号组内的行数
【发布时间】:2016-10-26 03:28:35
【问题描述】:

给定以下数据框:

import pandas as pd
import numpy as np
df=pd.DataFrame({'A':['A','A','A','B','B','B'],
                'B':['a','a','b','a','a','a'],
                })
df

    A   B
0   A   a 
1   A   a 
2   A   b 
3   B   a 
4   B   a 
5   B   a

我想创建列“C”,它对列 A 和 B 中每个组内的行进行编号,如下所示:

    A   B   C
0   A   a   1
1   A   a   2
2   A   b   1
3   B   a   1
4   B   a   2
5   B   a   3

到目前为止我已经尝试过了:

df['C']=df.groupby(['A','B'])['B'].transform('rank')

...但它不起作用!

【问题讨论】:

    标签: python-3.x pandas group-by pandas-groupby rank


    【解决方案1】:

    使用 groupby.rank 函数。 这是工作示例。

    df = pd.DataFrame({'C1':['a', 'a', 'a', 'b', 'b'], 'C2': [1, 2, 3, 4, 5]})
    df
    
    C1 C2
    a  1
    a  2
    a  3
    b  4
    b  5
    
    df["RANK"] = df.groupby("C1")["C2"].rank(method="first", ascending=True)
    df
    
    C1 C2 RANK
    a  1  1
    a  2  2
    a  3  3
    b  4  1
    b  5  2
    
    

    【讨论】:

      【解决方案2】:

      使用groupby/cumcount:

      In [25]: df['C'] = df.groupby(['A','B']).cumcount()+1; df
      Out[25]: 
         A  B  C
      0  A  a  1
      1  A  a  2
      2  A  b  1
      3  B  a  1
      4  B  a  2
      5  B  a  3
      

      【讨论】:

      • @Gokulakrishnan 回答的 rank() 函数在处理分组列值为数字的情况下确实更好
      • 后续反问,为什么通过阅读 Pandas 文档很难找到这样的解决方案?有时,要弄清楚如何做最简单的事情需要很长时间。
      • 我认为这是正确的方法。 rank() 假设数据是有序的,这可能是也可能不是。
      • 是的,不要使用排名,除非您的意思是要为每个组排序统计标签。
      猜你喜欢
      • 2018-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 2021-12-21
      • 2012-09-09
      • 2023-01-31
      相关资源
      最近更新 更多