Python, сравнивающий предыдущее и следующее значение строки - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть набор данных, как показано ниже в примере с колонкой (C1).сравнить значение с предыдущим значением в том же столбце и со следующим значением в том же столбце.На основе определенной метки условия строка.

 C1
----
 3
 2
 5
 3
 2
 4

Условие:

X - текущее значение
P - предыдущее значение
N - следующее значение
Firstи последнее значение по умолчанию равно «0»

  1. Если x больше P и больше N, тогда оно помечено как «0»:

    P N = 0

  2. P> x

  3. P

  4. P> X> N, тогда X равен "3"

Результат для сохранения - это отдельный столбец C2

Окончательный результат:

 C1  |  C2
-----+-----
 3   |  0
 2   |  2
 5   |  0
 3   |  3
 2   |  1
 4   |  0

Ответы [ 3 ]

0 голосов
/ 21 февраля 2019

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

0 голосов
/ 21 февраля 2019

Я полагаю, что сдвиг - вот путь,

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

df = pd.DataFrame([3,2,5,3,2,4], columns=['C1'])

df['P'] = df.C1.shift(1).fillna(0)
df['N'] = df.C1.shift(-1).fillna(0)
df['C2'] = np.nan

, давая нам:

    C1  P   N   C2
0   3   0.0 2.0 NaN
1   2   3.0 5.0 NaN
2   5   2.0 3.0 NaN
3   3   5.0 2.0 NaN
4   2   3.0 4.0 NaN
5   4   2.0 0.0 NaN

Затем мы сделаем сравнения, отбросим два сдвинутых столбца, которые мы сделалии все готово!

for index, row in df.iterrows():
    if (row.P < row.C1) and (row.C1 > row.N):
        df.at[index, 'C2'] = 0
    elif (row.P > row.C1) and (row.C1 < row.N):
        df.at[index, 'C2'] = 1
    elif (row.P < row.C1) and (row.C1 < row.N):
        df.at[index, 'C2'] = 2
    elif (row.P > row.C1) and (row.C1 > row.N):
        df.at[index, 'C2'] = 3

df.drop(['P', 'N'], 1, inplace=True)

Это оставляет нам:

    C1  C2
0   3   0.0
1   2   1.0
2   5   0.0
3   3   3.0
4   2   1.0
5   4   0.0

Надеюсь, это поможет!

0 голосов
/ 21 февраля 2019
c1 = [3,2,5,3,2,4]
c2 = [0]
for i in range(1,len(c1)-1):
    p = c1[i-1]
    x = c1[i]
    n = c1[i+1]
    if p < x and x > n:
        c2.append(0)
    elif p > x and x < n:
        c2.append(1)
    elif p < x and x < n:
        c2.append(2)
    elif p > x and x > n:
        c2.append(3)
c2.append(0)
print(c2)
>>> [0, 1, 0, 3, 1, 0]

Полагаю, вы ошиблись в примере списка вывода c2, с условиями, которые вы задали, выходные данные отличаются.

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