【问题标题】:Label a pandas column based on sign flips of another column根据另一列的符号翻转标记熊猫列
【发布时间】:2018-01-27 03:43:25
【问题描述】:

我有一个这样的熊猫数据框:

Index High Low MA(5)-MA(20) 
  0    100  90    -1
  1    101  91    -2
  2    102  92    +1
  3    99   88    +2

我想在 MA(5) - MA(20) 为正时获得最高点的最大值,而最低点的最小值则为负数。

问题是我只想要局部最大值和最小值而不是全局最大值,因此每次 MA(5) - MA(20) 的符号翻转时都必须重新设置最大值和最小值。

我不想使用 for 循环,因为它们在 python 中真的很慢。

有什么帮助吗?

【问题讨论】:

标签: python pandas


【解决方案1】:

您可以使用np.sign 获取最后一列的符号。执行groupby 操作,并使用np.where 进行相应的赋值。

v = np.sign(df['MA(5)-MA(20)']) < 1
g = df.groupby(v.ne(v.shift()).cumsum()) 

df['Maxima/Minima'] =  np.where(
       v, g.Low.transform('min'), g.High.transform('max')
)

df

   Index  High  Low  MA(5)-MA(20)  Maxima/Minima
0      0   100   90            -1             90
1      1   101   91            -2             90
2      2   102   92             1            102
3      3    99   88             2            102

您会注意到根据其符号为行分配了本地最小值/最大值。

【讨论】:

    【解决方案2】:

    这是你需要的吗?

    v=df['MA(5)-MA(20)'].gt(0).astype(int).diff().fillna(0).cumsum()
    
    df.groupby(v).High.transform('max').mask(df['MA(5)-MA(20)'] == 0,df.groupby(v).Low.transform('min'))
    
    0     90
    1     90
    2    102
    3    102
    Name: High, dtype: int64
    

    【讨论】:

    • 我猜你的意思是反转条件。 df['MA(5)-MA(20)']==0 返回正确答案 ;)
    猜你喜欢
    • 2019-08-11
    • 2020-12-11
    • 2023-02-05
    • 2020-11-26
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 2019-09-29
    • 2014-12-27
    相关资源
    最近更新 更多