分别用 1、-1 和 0 替换正值、负值和零值

Replacing positive, negative, and zero values by 1, -1, and 0 respectively

我有一个包含 11 列的 pandas 数据框(100,000 obs)。

我正在尝试根据 df['diff'](这是一个 pd.series object 整数值)

分配 df['trade_sign']

如果 diff 为正,则 trade_sign = 1
如果 diff 为负,则 trade_sign = -1
如果 diff 为 0,则 trade_sign = 0

到目前为止我尝试过的:

pos['trade_sign'] = (pos['trade_sign']>0) <br>
pos['trade_sign'].replace({False: -1, True: 1}, inplace=True)

但这显然没有考虑 0 值。
我还尝试了带有 if 条件的循环,但那没有用。

基本上,我如何修复我的 .replace 函数以考虑差异值 0。

理想情况下,我更喜欢使用 numpy 而不是带有 if 条件的循环的解决方案。

你可以这样做:

pos['trade_sign'] = (pos['diff'] > 0) * 1 + (pos['diff'] < 0) * -1

element-wise >< 比较的 boolean 结果自动转换为 int 以便与 [=18= 相乘] 和 -1

本示例输入和测试代码:

import pandas as pd
pos = pd.DataFrame({'diff':[-9,0,9,-8,0,8,-7-6-5,4,3,2,0]})
pos['trade_sign'] = (pos['diff'] > 0) * 1 + (pos['diff'] < 0) * -1
print(pos)

... 给出此输出:

    diff  trade_sign
0     -9          -1
1      0           0
2      9           1
3     -8          -1
4      0           0
5      8           1
6    -18          -1
7      4           1
8      3           1
9      2           1
10     0           0

UPDATE: 除了上面的解决方案,以及其他答案中的一些其他优秀想法,你可以使用 numpy where:

pos['trade_sign'] = np.where(pos['diff'] > 0, 1, np.where(pos['diff'] < 0, -1, 0))
    a = [-1 if df['diff'].values[i] < 0 else 1 for i in range(len(df['diff'].values))]
    df['trade_sign'] = a

numpy中有一个sign函数:

df["trade_sign"] = np.sign(df["diff"])

如果你想要整数,

df["trade_sign"] = np.sign(df["diff"]).astype(int)