标题可能不直观 - 让我举个例子。说我有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()
现在,我怎样才能获得最后一次出现的列最大值的位置,最多最小值的位置?
在视觉上,我想找到下面绿色最大值的位置:
忽略最小值后的最大值。
我可以使用.apply
执行此操作,但是可以使用掩码/高级索引来完成吗?
期望的结果:
a 2017-01-07
b 2017-01-03
c 2017-01-02
dtype: datetime64[ns]
答案 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