对于系列s
t = [0.1, 1, 2, 3, 0, 1, 2, 3, 4, 5, 0.9, 1, 2]
s = pd.Series(t)
每次s从最大值返回到最小值时,我都希望获得n
为最小的位置s.iloc[n]
(和值)。
所以我想得到这个例子的结果:
position value
0 0.1
4 0
10 0.9
我想有一个基于熊猫的解决方案,因为这个问题只是我要解决的另一个问题的输入。在这种情况下,数据量确实很大。
答案 0 :(得分:5)
如果条件仅仅是检查上一个元素:
t = [0.1, 1, 2, 3, 0, 1, 2, 3, 4, 5, 0.9, 1, 2]
s = pd.Series(t)
minimums = s[s<s.shift(1, fill_value=s[0]+1)]
>>> print(minimums)
0 0.1
4 0.0
10 0.9
dtype: float64
答案 1 :(得分:3)
只需检查哪些行的值小于上一行:
s = s[(s.index == 0) | (s < s.shift(1))].reset_index()
s.columns = ['position', 'value']
结果数据框:
position value
0 0 0.1
1 4 0.0
2 10 0.9
如果局部最小值在局部最大值之后并不总是紧随其后,则可以将条件扩展为:
(s.index == 0) | ((s < s.shift(1)) & (s < s.shift(-1)))
答案 2 :(得分:1)
也许是这样的:
t = [0.1, 1, 2, 3, 0, 1, 2, 3, 4, 5, 0.9, 1, 2]
s = pd.Series(t)
df=pd.DataFrame(s,columns=["original"])
然后使用熊猫差异功能:
df["diff"]=df["original"].diff()
original diff
0 0.1 NaN
1 1.0 0.9
2 2.0 1.0
3 3.0 1.0
4 0.0 -3.0
5 1.0 1.0
6 2.0 1.0
7 3.0 1.0
8 4.0 1.0
9 5.0 1.0
10 0.9 -4.1
11 1.0 0.1
12 2.0 1.0
最后只过滤diff列中的负值:
df.loc[df["diff"]<0]
4 0.0
10 0.9
Name: original, dtype: float64