Python rank: 给负数负数排序

Python rank: give negative rank to negative numbers

我有一组基本数据,例如:

ID Value
A  0.1
B  0.2
C  -0.1
D  -0.01
E  0.15

如果我们使用 data.rank() 我们得到结果:

ID Value
A  3
B  5
C  1
D  2
E  4

但我想要负值导致负排名,例如:

ID Value
A  1
B  3
C  -2
D  -1
E  2

基本上排名给负值一个负排名,而正值获得一个正排名,但我们得到 1 到 3 和 -1 到 -2 而不是 1 到 5。 非常感谢任何帮助。

跳出框框思考并整理您的价值观。

# create your dummy data
data = pd.DataFrame({'ID':list('ABCDE'), 'Value':[0.1,0.2,-0.1,-0.01,0.15]})

# sort the data so that we can use of the cumsum (and vectorize the operation)
data = data.sort_values('Value')

# Cumulartive sum of the booleans for the  positive values
# Minus the the inverse sum of the booleans of the negative values
data['RANK'] = (data['Value']>=0).cumsum() - (data['Value']<0)[::-1].cumsum() 

# Sort the values back to the original state ...    
data.sort_values('ID')


     ID     Value   RANK
0     A      0.10    1
1     B      0.20    3
2     C     -0.10   -2
3     D     -0.01   -1
4     E      0.15    2

分别对您的正值和负值进行排名,然后concat它们:

>>> pd.concat([df[df["Value"].gt(0)].rank(),df[df["Value"].lt(0)].mul(-1).rank().mul(-1)]).sort_index()

    ID  Value
0  1.0    1.0
1  2.0    3.0
2 -1.5   -2.0
3 -1.5   -1.0
4  3.0    2.0

另一种类似于 concat 答案的方法,但不那么紧凑:

import pandas as pd

A = ['A', 'B', 'C', 'D']
B = [-1, 1, 3, -2]

df = pd.DataFrame({'ID': A, 'value': B})

pos = df.where(df['value'] >= 0)['value'].rank()
neg = df.where(df['value'] < 0)['value'].rank()
pos.update(-neg)

df['rank'] = pos
print(df)