计算 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)
我有一个这样的数据框。发票被转换为 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)