检查列中的子集?

Checking for subset in a column?

如果证券的报价在 3 个交易日内没有变化,我正试图将一些价格数据标记为“过时”。我目前正在尝试使用:

firm["dev"] = np.std(firm["Price"],firm["Price"].shift(1),firm["Price"].shift(2))
firm["flag"] == np.where(firm["dev"] = 0, 1, 0)

但我一无所获。这就是我的数据框的样子。

Index Price Flag
1 10 0
2 11 0
3 12 0
4 12 0
5 12 1
6 11 0
7 13 0

感谢任何帮助!

如果你其他条件没问题,你可以先检查series.diff是否等于0,然后取cumsum检查你的cumsum是否为2(n-1)。还要检查下一行是否等于当前,当这两个条件都满足时,分配标志 1 else 0.

n=3
firm['Flag'] = (firm['Price'].diff().eq(0).cumsum().eq(n-1) & 
                firm['Price'].eq(firm['Price'].shift())).astype(int)

编辑,要使其成为具有连续 n 的广义函数,请使用:

def fun(df,col,n):
    c = df[col].diff().eq(0)
    return (c|c.shift(-1)).cumsum().ge(n) & df[col].eq(df[col].shift())

firm['flag_2'] = fun(firm,'Price',2).astype(int)
firm['flag_3'] = fun(firm,'Price',3).astype(int)

print(firm)

       Price  Flag  flag_2  flag_3
Index                             
1         10     0       0       0
2         11     0       0       0
3         12     0       0       0
4         12     0       1       0
5         12     1       1       1
6         11     0       0       0
7         13     0       0       0