我想知道是否有办法使用 np.sign 填充列,其中列查看另外两列,如果两列彼此相等,则返回相同的符号。否则,它将与上一行保持相同,直到两列相同。
使用我的 pd.dataframe 的更具体案例:
col_1 col_2 col_3 col_a col_b final_col # final_col swiches
row_1 10 5 5 +1 +1 +1 # start +1 except if a = -1
row_2 10 15 5 -1 +1 +1 # only one flips, stays +1
row_3 10 15 15 -1 -1 -1 # both flip to same sign, changes to -1
row_4 20 15 15 +1 +1 +1 # both flip to same sign, changes to +1
row_5 20 25 25 -1 -1 -1 # both flip to same sign, changes to -1
row_6 20 15 25 +1 -1 -1 # only one flips, stays -1
row_7 20 25 15 -1 +1 -1 # both flip to different sign, stays -1
row_1,row_2,row_3有各种正整数,大部分呈上升趋势,但有时可能会下降(从不为负)。
这是我必须开始的,但我不确定如何前进:
df["col_a"] = np.sign(df.col_1.sub(df.col_3))
df["col_b"] = np.sign(df.col_1.sub(df.col_2))
df["final_col"] = np.sign(df.col_a.eq(df.col_b)) # gave an UFuncTypeError error
df
正如您在代码中看到的:
np.sign(<>.sub(<>)) 以下情况是正确的:
col_a = +1 if col_1 > col_3
col_a = -1 if col_1 < col_3
col_b = +1 if col_1 > col_2
col_b = -1 if col_1 < col_2
我可以尝试的任何建议都会非常有帮助,它不必使用 np.sign。谢谢!
这是基于对问题的以下解释:
col_a
和col_b
(以下称为a
和b
)是{-1, 1}
中的符号;- 从一行到下一行,零个或多个
a
,b
可以"翻转"(改变符号); - 对于每一行,都有一个变化位,该位取决于该行的
a
和b
,以及a
和b
的翻转; change
True
a == b
,a
或b
(或两者)翻转;- 最终结果是一个从 +1 开始的符号(无论第一行是什么),并且每当
change
True
时就会翻转。
a = df['col_a']
b = df['col_b']
change = ((a == b) & ((a.diff().fillna(0) != 0) | (b.diff().fillna(0) != 0)))
newdf = df.assign(final_col=(1 - 2 * change.astype(int)).cumprod())
在您的示例中:
>>> newdf
col_1 col_2 col_3 col_a col_b final_col
row_1 10 5 5 1 1 1
row_2 10 15 5 -1 1 1
row_3 10 15 15 -1 -1 -1
row_4 20 15 15 1 1 1
row_5 20 25 25 -1 -1 -1
row_6 20 15 25 1 -1 -1
row_7 20 25 15 -1 1 -1