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 > 0
、i == 0
、i < 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
我正在尝试使用以下函数对列进行排名:
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 > 0
、i == 0
、i < 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