使用 np.sign() 添加新的 DF 列,该列会根据其他列符号进行更改



我想知道是否有办法使用 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_acol_b(以下称为ab)是{-1, 1}中的符号;
  • 从一行到下一行,零个或多个ab可以"翻转"(改变符号);
  • 对于每一行,都有一个变化位,该位取决于该行的ab,以及ab的翻转;
  • changeTruea == bab(或两者)翻转;
  • 最终结果是一个从 +1 开始的符号(无论第一行是什么),并且每当changeTrue时就会翻转。
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

相关内容

最新更新