如何从其他列中提取元素相对于另一个值的索引值?
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
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