计算 pandas 中的排名

Count Rank in pandas

我有一个这样的数据框。发票被转换为 table,其中每一行都有针对每个客户的单一产品。这个 table 包含数百万行 -

customer invoice products
a INVC001 xx
a INVC001 yy
a INVC002 zz
a INVC003 aa
b INVC004 xx
b INVC004 aa
b INVC004 bb
b INVC005 cc

现在我想创建一个列,我想在其中对每个客户的发票进行排名。我想要的table

customer invoice products rank
a INVC001 xx 1
a INVC001 yy 1
a INVC002 zz 2
a INVC003 aa 3
b INVC004 xx 1
b INVC004 aa 1
b INVC004 bb 1
b INVC005 cc 2

我尝试使用 cumcount,使用此代码 df.groupby(['customer','invoice'])['invoice'].cumcount()+1 对客户和发票进行分组,也尝试过 nggroup() 但无法生成我预期的输出。

有什么numpy/pandas方法可以创建这样的table吗?或者,有什么优化的方法可以做到这一点。

使用factorize in GroupBy.transform:

df['rank'] = df.groupby('customer')['invoice'].transform(lambda x: pd.factorize(x)[0]) + 1

对我来说rank失败:

df['rank'] = df.groupby('customer')['invoice'].rank(method='dense')

DataError: No numeric types to aggregate

解决方案应该像@pavel 提到的那样:

df['rank'] = df.groupby('customer')['invoice'].rank(method='dense', numeric_only=False)