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)
我有一组基本数据,例如:
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)