屏蔽所有出现在pandas DataFrame中最大值之前的值

时间:2019-01-28 20:06:49

标签: python pandas dataframe

我想从pd.DataFrame.idxmax中获取结果,并使用它来更改具有最大值的索引之前的值。

如果我有df

            Mule Creek  Saddle Mtn.  Calvert Creek
Date                                              
2011-05-01   23.400000    35.599998            8.6
2011-05-02   23.400000    35.599998            8.0
2011-05-03   23.400000    35.700001            7.6
2011-05-04   23.400000    50.000000            7.1
2011-05-05   23.100000    35.799999            6.4
2011-05-06   23.000000    35.799999            5.7
2011-05-07   40.000000    35.900002            4.7
2011-05-08   23.100000    36.500000           12.0
2011-05-09   23.299999    37.500000            4.4
2011-05-10   23.200001    37.500000            3.6

我发现每列的最大值出现在哪里:

max = df.idxmax()

我想在确定的最大值max全部np.nan

之前创建值

所需结果:

            Mule Creek  Saddle Mtn.  Calvert Creek
Date                                              
2011-05-01         NaN          NaN            NaN
2011-05-02         NaN          NaN            NaN
2011-05-03         NaN          NaN            NaN
2011-05-04         NaN    50.000000            NaN
2011-05-05         NaN    35.799999            NaN
2011-05-06         NaN    35.799999            NaN
2011-05-07   40.000000    35.900002            NaN
2011-05-08   23.100000    36.500000           12.0
2011-05-09   23.299999    37.500000            4.4
2011-05-10   23.200001    37.500000            3.6

3 个答案:

答案 0 :(得分:5)

可以检查累积最大值与最大值相同的地方:

df.where(df.cummax() == df.max())

            Mule Creek  Saddle Mtn.  Calvert Creek
Date                                              
2011-05-01         NaN          NaN            NaN
2011-05-02         NaN          NaN            NaN
2011-05-03         NaN          NaN            NaN
2011-05-04         NaN    50.000000            NaN
2011-05-05         NaN    35.799999            NaN
2011-05-06         NaN    35.799999            NaN
2011-05-07   40.000000    35.900002            NaN
2011-05-08   23.100000    36.500000           12.0
2011-05-09   23.299999    37.500000            4.4
2011-05-10   23.200001    37.500000            3.6

答案 1 :(得分:4)

我将使用maxcumprod

df[(df < df.max()).cumprod().ne(1)]

            Mule Creek  Saddle Mtn.  Calvert Creek
Date                                              
2011-05-01         NaN          NaN            NaN
2011-05-02         NaN          NaN            NaN
2011-05-03         NaN          NaN            NaN
2011-05-04         NaN    50.000000            NaN
2011-05-05         NaN    35.799999            NaN
2011-05-06         NaN    35.799999            NaN
2011-05-07   40.000000    35.900002            NaN
2011-05-08   23.100000    36.500000           12.0
2011-05-09   23.299999    37.500000            4.4
2011-05-10   23.200001    37.500000            3.6

但是也许还有其他方法。

答案 2 :(得分:1)

简单但可能效率不高的方法:

for c in df.columns:
  df[c].loc[df[c].index[0]: df[c].idxmax()] = np.nan