最小值最后出现的指数

Bra*_*mon 4 python indexing numpy pandas

标题可能不直观 - 让我举一个例子.说我有df,创建时:

a = np.array([[ 1. ,  0.9,  1. ],
              [ 0.9,  0.9,  1. ],
              [ 0.8,  1. ,  0.5],
              [ 1. ,  0.3,  0.2],
              [ 1. ,  0.2,  0.1],
              [ 0.9,  1. ,  1. ],
              [ 1. ,  0.9,  1. ],
              [ 0.6,  0.9,  0.7],
              [ 1. ,  0.9,  0.8],
              [ 1. ,  0.8,  0.9]])

idx = pd.date_range('2017', periods=a.shape[0])
df = pd.DataFrame(a, index=idx, columns=list('abc'))
Run Code Online (Sandbox Code Playgroud)

我可以得到每个相应列的索引位置最小值

df.idxmin()
Run Code Online (Sandbox Code Playgroud)

现在,我怎么能拿列方向最大最后一次出现的位置,达到最低的位置?

在视觉上,我想找到下面绿色最大的位置:

在此输入图像描述

忽略最小值后的最大值.

我可以这样做.apply,但可以使用掩码/高级索引来完成吗?

期望的结果:

a   2017-01-07
b   2017-01-03
c   2017-01-02
dtype: datetime64[ns]
Run Code Online (Sandbox Code Playgroud)

cs9*_*s95 7

应用a mask然后调用idxmax反转的数据帧.

df.mask((df == df.min()).cumsum().astype(bool))[::-1].idxmax()

a   2017-01-07
b   2017-01-03
c   2017-01-02
dtype: datetime64[ns]
Run Code Online (Sandbox Code Playgroud)

细节

首先,确定每列最小项目的位置.

df.min()

a    0.6
b    0.2
c    0.1
dtype: float64

i = df == df.min()
i

                a      b      c
2017-01-01  False  False  False
2017-01-02  False  False  False
2017-01-03  False  False  False
2017-01-04  False  False  False
2017-01-05  False   True   True
2017-01-06  False  False  False
2017-01-07  False  False  False
2017-01-08   True  False  False
2017-01-09  False  False  False
2017-01-10  False  False  False
Run Code Online (Sandbox Code Playgroud)

现在,掩盖这些价值观以及更多!

j = df.mask(i).cumsum().astype(bool))
j

              a    b    c
2017-01-01  1.0  0.9  1.0
2017-01-02  0.9  0.9  1.0
2017-01-03  0.8  1.0  0.5
2017-01-04  1.0  0.3  0.2
2017-01-05  1.0  NaN  NaN
2017-01-06  0.9  NaN  NaN
2017-01-07  1.0  NaN  NaN
2017-01-08  NaN  NaN  NaN
2017-01-09  NaN  NaN  NaN
2017-01-10  NaN  NaN  NaN
Run Code Online (Sandbox Code Playgroud)

要查找最后一个最大值,只需反向并调用即可idxmax.

j[::-1].idxmax()

a   2017-01-07
b   2017-01-03
c   2017-01-02
dtype: datetime64[ns]
Run Code Online (Sandbox Code Playgroud)