分钟前最后一次出现的索引

时间:2017-12-19 17:58:03

标签: python pandas numpy indexing

标题可能不直观 - 让我举个例子。说我有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'))

我可以使用

获取每个相应列的索引位置
df.idxmin()

现在,我怎样才能获得最后一次出现的列最大值的位置,最多最小值的位置?

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

enter image description here

忽略最小值后的最大值。

我可以使用.apply执行此操作,但是可以使用掩码/高级索引来完成吗?

期望的结果:

a   2017-01-07
b   2017-01-03
c   2017-01-02
dtype: datetime64[ns]

3 个答案:

答案 0 :(得分:6)

应用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]

<强>详情

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

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

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

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

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

j[::-1].idxmax()

a   2017-01-07
b   2017-01-03
c   2017-01-02
dtype: datetime64[ns]

答案 1 :(得分:4)

使用masking -

>>> a = df.values
>>> mask = a.argmin(0) > np.arange(a.shape[0])[:,None]
>>> idx = a.shape[0] - (a*mask)[::-1].argmax(0) - 1
>>> df.index[idx]
DatetimeIndex(['2017-01-07', '2017-01-03', '2017-01-02'], dtype='datetime64[ns]', freq=None)

这是另一个基于masking的基础NaN,将每个列中的无效值设置为np.nanargmax,然后使用a = df.values min_idx = a.argmin(0) mask = min_idx < np.arange(a.shape[0])[:,None] a[mask] = np.nan idx = a.shape[0]-np.nanargmax(a[::-1],axis=0) - 1 out = df.index[idx] -

ResultDisplay

答案 2 :(得分:1)

使用crontab

last_valid_index