分别用 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)
我有一个包含 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)