Итеративные строки в кадре данных исключают при выполнении условия - PullRequest
0 голосов
/ 21 ноября 2018

У меня большой Dataframe, вот пример данных:

df['length']
353.216  
353.514  
273.559  
274.199  
353.813  
354.116 

Я хочу перебрать строки и сравнить i + 1 со строкой i (и если разница меньше 2, тозначение должно остаться, иначе вся строка должна быть отфильтрована), я попытался с логическим индексированием: diff = abs(df['length']).diff() < 2, а затем df_clean = df[diff]

Я хочу избавиться от всех «неправильных» строк.Я знаю, что каждый ряд i + 1 должен быть в диапазоне + - 2.Проблема в том, что может быть более одного ряда.Я хочу избавиться от 273.559 и 274.199 (в данном случае), так как разница между ними меньше 2, мне нужно будет повторить все строки два раза.Включение цикла for для многократного повторения не кажется мне лучшим подходом, какие-либо хорошие решения?

Редактировать: Мой вывод должен выглядеть следующим образом:

df_clean_data ['length']
353.216  
353.514  
353.813  
354.116 

Спасибозаранее Зига

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Ключом к успеху является функция, работающая почти так же, как diff():

def mark(x):
    global prevX
    difr = abs(x - prevX)
    result = difr >= 2
    if not result:
        prevX = x
    return result

Но различия заключаются в следующем:

  1. Эта функция использует глобальную переменную "предыдущий x"(prevX), содержащий изначально первое length (программа должна установить его).
  2. Подстановка текущего x в prevX происходит только , еслиразница меньше 2. Таким образом, в этом отношении мы «пропускаем» удаляемые строки.

Первоначальный шаг - установить prevX на 1-ю длину:

prevX = df.loc[0, 'length']

А фактическая обработка выполняется с помощью одной инструкции:

df.drop(df[df['length'].apply(mark)].index, inplace=True)

Немного объяснения:

  • df['length'].apply(mark) генерирует логический массив.True означает «эта строка должна быть удалена».В целях указания выполните эту команду в одиночку (перед удалением).
  • df[...].index создает список значений индекса для этих строк.
  • df.drop удаляет строки с заданными индексами (на месте).

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

import pandas as pd

def mark(x):
    global prevX
    difr = abs(x - prevX)
    result = difr > 2
    if not result:
        prevX = x
    return result

data={ 'length': [ 353.216, 353.514, 273.559, 274.199, 353.813, 354.116 ] }
df = pd.DataFrame(data)
prevX = df.loc[0, 'length']
df.drop(df[df['length'].apply(mark)].index, inplace=True)

Результат:

    length
0  353.216
1  353.514
4  353.813
5  354.116

Альтернатива: если вы хотите получить результат в другом Dataframe,удалите inplace=True и подставьте результат в целевую переменную.

0 голосов
/ 21 ноября 2018

Ваш вопрос не совсем ясен, но все же, что я понял, я пытаюсь предложить какой-то способ.

  1. отсортировать DataFrame по этому столбцу (длина)

  2. использование для проверки петли для вашей разницы

  3. , если вы хотите, чтобы эта запись добавила ее в новый DataFrame

  4. используйте новыйDataFrame

другой способ Поскольку у вас есть Big DataFrame

  1. , сортируйте DataFrame по этому столбцу (длина)

  2. создайте новый столбец

  3. , используя для проверки цикла вашу разницу

  4. , если вы этого не хотитезапись записи np.nan в новом столбце

  5. удалить все записи, содержащие np.nan в новом столбце

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