根据特定列中的重复周期值对pandas df进行切片

时间:2019-05-26 11:08:08

标签: python python-3.x pandas numpy data-cleaning

我有如下所示的df(示例)

index       y       z
0           118     .
1           118     .
2           118     .
3           116
4           116
5           110
6           110
7           104
8           104
.
.
.
.
.
320         3       .
321         3       .
322         3
323         7
324         7
328         11
329         11
.
.
.
350         25
351         25

正如您在column y中看到的那样,值从118开始,一直保持在decreasing的索引number 3上。再次使322increasing保持距离,并在index 323 of value 7达到25的值

您还可以在y列中找到重复的值。 (index 351.

我的要求

我想分割该df的第一部分。(118 repeated thrice, 116 repeated twice and so on.... 3) 即Value from 118 to

我的df外观

from index 0 till 322

我认为应该有一种替代的pythonic方式,使它更容易。 (内置函数或使用index y z 0 118 . 1 118 . 2 118 . 3 116 4 116 5 110 6 110 7 104 8 104 . . . . . 320 3 . 321 3 . 322 3 ),将不胜感激。

2 个答案:

答案 0 :(得分:3)

使用df作为输入数据帧和序列中的索引-0,1,..,您可以-

df.iloc[:(df.y.shift()<df.y).idxmax()[0]]

对于通用索引格式,您可以-

df.iloc[:(df.y.shift()<df.y).to_numpy().argmax()]

样品运行-

In [106]: df
Out[106]: 
      y         z
7   118  0.149675
8   118  0.386489
9     3  0.449950
10    3  0.902349
11    8  0.969809
12   11  0.170910

In [107]: df.iloc[:(df.y.shift()<df.y).to_numpy().argmax()]
Out[107]: 
      y         z
7   118  0.149675
8   118  0.386489
9     3  0.449950
10    3  0.902349

我们还可以对数组数据使用切片-

In [108]: a = df.y.to_numpy().ravel()

In [109]: df.iloc[:(a[:-1] < a[1:]).argmax()+1]
Out[109]: 
      y         z
7   118  0.149675
8   118  0.386489
9     3  0.449950
10    3  0.902349

或者,用np.diff代替移位比较-

In [110]: df.iloc[:(np.diff(a)>0).argmax()+1]
Out[110]: 
      y         z
7   118  0.149675
8   118  0.386489
9     3  0.449950
10    3  0.902349

答案 1 :(得分:0)

您可以通过以下命令获取所需切片的副本:

df_copy = df.iloc[0:322]