标题可能不直观——让我举个例子。假设我有 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]
最佳答案
应用掩码
,然后在反向数据帧上调用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
现在,掩盖这些值(value)观及其他值(value)观!
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]
关于python - max 在 min 之前最后一次出现的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47892698/