如何获得准周期序列中的最小值?

时间:2019-05-05 08:34:00

标签: python pandas group-by pandas-groupby

对于系列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

我想有一个基于熊猫的解决方案,因为这个问题只是我要解决的另一个问题的输入。在这种情况下,数据量确实很大。

3 个答案:

答案 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