Подсчет положительных и отрицательных последовательных элементов в кадре данных на основе условия - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть такой фрейм данных.

import pandas as pd

df = pd.DataFrame({
    'col': ['neutral', 'neutral', 'neutral', 'positive', 'positive', 'negative', 'neutral']})

Теперь я хочу обновить 'col' так, чтобы я получал истину, когда есть изменение с положительного на отрицательное или наоборот, и ложное в противном случае (т.е. последовательные равные значения), а такжеfalse, когда происходит изменение с положительного / отрицательного на нейтральное и наоборот.

Я пробовал несколько методов с grouby и transform, но ничего не работает.

Мой желаемый результат будет:

df = pd.DataFrame({
    'col': ['False', 'False', 'False', 'False', 'False', 'True', 'False']})  

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Длинное выражение, которое генерирует логические значения в зависимости от ваших условий:

(((df['col'] == 'positive') & (df['col'].shift(1) == 'negative')) | ((df['col'] == 'negative') & (df['col'].shift(1) == 'positive')))

Это использует побитовые операторы, чтобы сказать, является ли текущая позиция положительной, а последующая отрицательная, True или текущая позиция отрицательнойи следующее является положительным, True иначе возвращает false.

>>> (((df['col'] == 'positive') & (df['col'].shift(1) == 'negative')) | ((df['col'] == 'negative') & (df['col'].shift(1) == 'positive')))
0    False
1    False
2    False
3    False
4    False
5     True
6    False
Name: col, dtype: bool

Либо оба первых условия должны быть выполнены для возврата true, либо оба вторых условия должны быть выполнены для возврата true.

0 голосов
/ 20 декабря 2018

map + diff

Карта положительная и отрицательная к 1 и -1 соответственно и нейтральная к 0.Когда вы берете разность рядов, абсолютное значение выходных данных каждый раз, когда положительные и отрицательные следуют друг за другом, будет 2, что вы можете легко проверить, что приведет к желаемому результату:

d = {'positive': 1, 'negative': -1, 'neutral': 0}

df.col.map(d).diff().abs().eq(2)

0    False
1    False
2    False
3    False
4    False
5     True
6    False
Name: col, dtype: bool
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...