如何从其他列中提取元素相对于另一个值的索引值?

How can i extract the index value of an element with respect to another value from some other column?

df1['3DaysMaxHigh']=df1['High'].rolling(window=3).max().shift()
df1['Daysfrom3DayMaxHigh']=('NaN','NaN','NaN',3,1,1,2,3)

Date         High      3DaysMaxHigh   Daysfrom3DayMaxHigh

2021-05-03  1361.000000   NaN              NaN
2021-05-04  1354.949951   NaN              NaN
2021-05-05  1343.900024   NaN              NaN
2021-05-06  1364.699951 1361.000000         3
2021-05-07  1373.050049 1364.699951         1
2021-05-10  1352.900024 1373.050049         1
2021-05-11  1341.000000 1373.050049         2
2021-05-12  1330.000000 1373.050049         3

第 'Daysfrom3DayMaxHigh' 列的值将用代码填充。 对于“3DaysMaxHigh”列中的每个值,自从列 'High' 中的最大高值出现以来经过的天数应提取到列 'Daysfrom3DayMaxHigh'.

在 Excel 中,使用 match() 函数也是可能的。

如果我没理解错的话,你想要的是:.

你可以这样做:

In [58]: df1.index[df1['High'].rolling(window=3).apply(np.argmax, raw=True)[2:-1].astype(int)+np.ar
    ...: ange(len(df1['High'])-3)]
Out[58]: Index(['2021-05-03', '2021-05-06', '2021-05-07', '2021-05-07', '2021-05-07'], dtype='object', name='Date')

可以用idxmax()得到滚动最大值的行索引window然后减去df1.index得到当前行和最大值的相对距离值,如下:

df1['Daysfrom3DayMaxHigh'] = df1.index - df1['High'].rolling(window=3).apply(lambda x: x.idxmax()).shift()

如果你的Date列实际上是行索引,你可以在操作前重置索引,然后再恢复,如下:

df1 = df1.reset_index()
df1['Daysfrom3DayMaxHigh'] = df1.index - df1['High'].rolling(window=3).apply(lambda x: x.idxmax()).shift()
df1 = df1.set_index('Date')

结果:

print(df1)



                   High  3DaysMaxHigh  Daysfrom3DayMaxHigh
Date                                                      
2021-05-03  1361.000000           NaN                  NaN
2021-05-04  1354.949951           NaN                  NaN
2021-05-05  1343.900024           NaN                  NaN
2021-05-06  1364.699951   1361.000000                  3.0
2021-05-07  1373.050049   1364.699951                  1.0
2021-05-10  1352.900024   1373.050049                  1.0
2021-05-11  1341.000000   1373.050049                  2.0
2021-05-12  1330.000000   1373.050049                  3.0