Как создать столбец в кадре данных pandas, используя значения из двух строк? - PullRequest
0 голосов
/ 29 мая 2020

Как мне выполнить эту операцию?

Начальный Df:

    A B C D
0   0 1 0 0
1   1 1 1 1
2   0 0 1 1
3   0 1 0 1
4   1 1 0 0
5   1 1 1 0

Конечный Df:

    A B C D Param1 Param2 Param3 
0   0 1 0 0      0      0      0
1   1 1 1 1      3      1      0
2   0 0 1 1      0      2      2
3   0 1 0 1      1      1      1
4   1 1 0 0      1      1      1
5   1 1 1 0      1      2      0

В основном я хочу сравнить значения на две последовательные строки и сохраните количество этих сравнений в новом столбце.

Детали расчета:
Для первой строки (индекс 0): Param1, Param2, Param3 будут равны 0

  1. Param1: это количество раз, когда 0 из строки предварительного просмотра изменялось на 1 в текущей строке, пример (посмотрите на индекс 1): три 0 из индекса 0 преобразуются в 1 в индексе 1, следовательно, Param1 для индекса 1 = 3
  2. Param2: это количество единиц 1 из предыдущей строки, которые остаются неизменными в текущей строке, например (посмотрите на индекс 3): один 1 из индекса 2 остается неизменным в индексе 3, следовательно, Param2 для индекса 3 = 1
  3. Param3: это количество единиц 1 из предыдущей строки, которые изменились на 0 в текущей строке, например (посмотрите на индекс 2) : два 1 из индекса 1 изменились на 0, в индексе 2, следовательно, Pa ram3 для индекса 3 = 2

Ответы [ 2 ]

4 голосов
/ 29 мая 2020

Вы можете просто скопировать diff и проверить выполнение вышеуказанных условий следующим образом:

d = df.diff()
df.assign(param1=d.eq(1).sum(1),
          param2=(d.eq(0)&df.eq(1)).sum(1),
          param3=d.eq(-1).sum(1))

   A  B  C  D  param1  param2  param3
0  0  1  0  0       0       0       0
1  1  1  1  1       3       1       0
2  0  0  1  1       0       2       2
3  0  1  0  1       1       1       1
4  1  1  0  0       1       1       1
5  1  1  1  0       1       2       0
2 голосов
/ 29 мая 2020

IIU C:

shift = df.shift()
df['Param1'] = (df.eq(1) & shift.eq(0)).sum(1).astype(int)
df['Param2'] = (df.eq(1) & shift.eq(1)).sum(1).astype(int)
df['Param3'] = (df.eq(0) & shift.eq(1)).sum(1).astype(int)

Вывод:

   A  B  C  D  Param1  Param2  Param3
0  0  1  0  0       0       0       0
1  1  1  1  1       3       1       0
2  0  0  1  1       0       2       2
3  0  1  0  1       1       1       1
4  1  1  0  0       1       1       1
5  1  1  1  0       1       2       0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...