Нахождение последовательности чисел в кадре данных панд, которая соответствует определенным критериям - PullRequest
0 голосов
/ 28 августа 2018

Допустим, у нас есть столбец данных, который выглядит следующим образом:

import pandas as pd
import numpy as np
x = np.linspace(1, 25, num=25)
df=pd.DataFrame(np.sin(x)* np.random.randint(10,50),columns=['Curve'])
df2=pd.DataFrame(np.linspace(4,5,num=5))
df = df['Curve'].append(df2)
df.index=(range(len(df)))

Теперь давайте предположим, что мы хотели бы найти пять чисел, которые мы добавили к исходному кадру данных, найдя последовательность из пяти чисел, ВСЕ из которых имеют инкрементную разницу между ними, которая составляет <1. Как я мог сделать это? Предпочтительно таким образом, чтобы он работал на всех столбцах в рамках одного кадра данных одновременно. </p>

Я знаю, что в этом случае я просто прикрепил их к концу, но это потому, что я все еще нахожусь в процессе обучения, как манипулировать кадрами данных, и я не уверен, как легко вставить 5 новых значений в «середина» колонки (не стесняйтесь включать, как это сделать, было бы очень признательно). Это просто иллюстративный пример, но я хотел бы изучить концепцию, чтобы применить его к более сложным наборам данных.

Я думал об использовании «если» в сочетании с модулем сдвига индекса и логическим индексированием, но прежде чем я попробую это, мне интересно узнать, существует ли более элегантный и простой способ сделать это.

1 Ответ

0 голосов
/ 28 августа 2018

Фрагмент ниже должен делать то, что вы ищете. Сначала проверьте наличие строк меньше 1,0, кроме предыдущей. Чтобы поймать первый ряд группы, проделайте то же самое со следующим рядом. Объедините их с np.logical_or и создайте номера групп еще раз, используя shift.

Наконец, отфильтруйте группы, которые мы создали, которые имеют все значения «True»; то есть каждое значение в группе находится в пределах одного из ее соседей. Как только у нас будут все положительные группы, возьмите самую большую (не обязательно группу из пяти человек). Как только мы получим этот номер группы, вернем эти строки из исходного df.

df.columns = ['curve']
a = abs(df.curve - df.curve.shift()) < 1.0    
b = abs(df.curve - df.curve.shift(-1)) < 1.0  
c = np.logical_or(a, b)                       
d = (c != c.shift()).cumsum()                 
df['c'] = c
df['d'] = d

df = df.groupby(d).filter(lambda x: all(x['c']))
max_group = df.loc[df.groupby(d).cumcount().idxmax()]['d']

df_added = df.loc[df['d'] == max_group]

РЕДАКТИРОВАТЬ: Я также должен отметить, что проблемы, поднятые в комментариях к вашему первоначальному вопросу, действительны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...