Фильтр данных Pandas для положительных и отрицательных значений - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть pandas dataframe с 3 столбцами, где:

  • Категория dtype - строка
  • Дата dtype - datetime
  • Значения dtype - float

    df = pd.DataFrame()
    df['category'] = ['a', 'b', 'b', 'b', 'c', 'a', 'b', 'c', 'c', 'a']
    df['date'] = ['2018-01-01', '2018-01-01', '2018-01-03', '2018-01-05', '2018-01-01', '2018-01-02', '2018-01-06', '2018-01-03', '2018-01-04','2018-01-01']
    df['values'] = [1, 2, -1.5, 2.3, 5, -0.7, -5.2, -5.2, 1, -1.1]
    df
    

Представление кадра данных

Я хочу отфильтровать строки, которые имеют положительное значение и отрицательное значение (с наименьшей разницей). Закрытьна эту дату для каждой категории.

Итак, по сути, вывод выглядит так:

df = pd.DataFrame()
df['category'] = ['a', 'a','b', 'b', 'c', 'c']
df['date'] = ['2018-01-01', '2018-01-01', '2018-01-01', '2018-01-03', '2018-01-01', '2018-01-03']
df['values'] = [1, -1.1, 2, -1.5, 5, -5.2]
df

Отфильтрованный фрейм данных

Я смотрел похожие запросына SO ( Определение ближайшего значения в столбце для каждого фильтра с использованием Pandas , Как найти ближайшие значения в ряду панд к номеру ввода? )

Первый использует idxmin, который возвращает первое вхождение, а не самое близкое по значению.

Вторая ссылка говорит о конкретном значении в качестве ввода - я не думаю, что чистый np.argsort работает в моем случае.

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

Любое руководство будет с благодарностью.

1 Ответ

0 голосов
/ 17 сентября 2018

IIUC, сначала отсортируйте ваш фрейм данных, затем используйте idxmin:

df1 = df.sort_values(['category','date'])
df1[df1.groupby('category')['values']\
       .transform(lambda x: x.index.isin([x.ge(0).idxmin(), x.lt(0).idxmin()]))]

Выход:

  category        date  values
0        a  2018-01-01     1.0
9        a  2018-01-01    -1.1
1        b  2018-01-01     2.0
2        b  2018-01-03    -1.5
4        c  2018-01-01     5.0
7        c  2018-01-03    -5.2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...