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)
应用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)
| 归档时间: |
|
| 查看次数: |
547 次 |
| 最近记录: |