нарезка панд df на основе повторяющихся значений цикла в определенном столбце - PullRequest
0 голосов
/ 26 мая 2019

У меня есть 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 при индексе 322.Снова он удерживает increasing от index 323 of value 7 и достигает значения 25 при index 351.

Также вы можете найти повторное значение в столбце y.(118 repeated thrice, 116 repeated twice and so on....)

Мои требования

Я хотел бы нарезать первую часть этого df. (Value from 118 to 3), то есть from index 0 till 322.

как должен выглядеть мой 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

Я считаю, что должен быть альтернативный питонический способ, который облегчит его.(Встроенная функция или использование numpy) Любая помощь будет оценена.

Ответы [ 2 ]

3 голосов
/ 26 мая 2019

С 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
0 голосов
/ 26 мая 2019

Вы можете получить копию необходимого среза с помощью следующей команды:

df_copy = df.iloc[0:322]
...