Pandas 阶梯函数

Pandas Step function with rank

我正在尝试使用以下函数对列进行排名:

f(x) = if x=0, then y=0 else if x<0 then y=0.5 else y=rank(x) 关于如何实现此目标的任何想法?

所以你说你已经有了排名(x 是数据框,col 是列名):

x[col] = x[x[col]>0].rank(pct=True, method='average')
x = x.fillna(0)

补丁以包含您的其他条件:

x[col] = np.where(x[col] < 0, 0.5, x[col])
x[col] = np.where(x[col] == 0, 0, x[col])

应该不会有覆盖问题(nan转换成0放在一边)因为i > 0i == 0i < 0对于实数都是互斥的i.


你可以用这样的东西组合你的所有函数:

s = df['score'].copy()
df['score'] = np.where(
    s > 0, s.rank(pct=True, method='average'),
    np.where(
        s < 0, 0.5,
        0)
)

您可以使用基本索引

df = pd.DataFrame({"x": [2, 3, 1, -1, 0]})
df["y"] = df["x"].rank()
df["y"][df["x"] == 0] = 0
df["y"][df["x"] < 0] = .5

loc

df["y"] = df["x"].rank()
df.loc[df["x"] == 0, "y"] = 0
df.loc[df["x"] < 0, "y"] = .5

或多个.where条件

df["y"] = df["x"].where(df["x"] == 0, df["x"].rank().where(df["x"] > 0, .5))

这是一种方法来完成您的问题:

df['y'] = (df.x < 0) * 0.5 + (df.x > 0) * df.x.rank()

例如:

import pandas as pd
df = pd.DataFrame({'x' : [-2, -1, 0, 0, 1, 2, 3, 4]})
df['y'] = (df.x < 0) * 0.5 + (df.x > 0) * df.x.rank()
print(df)

输出:

   x    y
0 -2  0.5
1 -1  0.5
2  0  0.0
3  0  0.0
4  1  5.0
5  2  6.0
6  3  7.0
7  4  8.0