【问题标题】:How can i extract the index value of an element with respect to another value from some other column?如何从其他列中提取元素相对于另一个值的索引值?
【发布时间】:2021-05-14 06:28:39
【问题描述】:

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”列中从该最大 High 值出现以来经过的天数提取到“Daysfrom3DayMaxHigh”列中。

在 Excel 中,match() 函数也是如此。

【问题讨论】:

    标签: python excel pandas function match


    【解决方案1】:

    您可以使用idxmax()获取滚动窗口最大值的行索引,然后用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
    

    【讨论】:

    • 优秀。谢谢@SeaBean
    • @mrspra​​win 很高兴为您提供帮助!记得accept the answer帮助别人找到正确的解决方案! :-)
    【解决方案2】:

    如果我理解正确,你想要的是:similar question

    你可以这样做:

    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')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-08
      • 1970-01-01
      相关资源
      最近更新 更多