Как векторизовать сравнение в pandas dataframe? - PullRequest
2 голосов
/ 14 мая 2019

У меня есть часть фрейма данных df, например:

| nr | Time | Event |
|----|------|-------|
| 70 | 8    |       |
| 70 | 0    |       |
| 70 | 0    |       |
| 74 | 52   |       |
| 74 | 12   |       |
| 74 | 0    |       |

Я хочу назначить события последнему столбцу. Первая запись по умолчанию равна 1.

If Time[i] < 7 and nr[i] != nr[i-1], then Event[i]=Event[i-1]+1. 

If Time[i] < 7 and nr[i] = nr[i-1], then Event[i]=Event[i-1]

If Time[i] > 7 then Event[i]=Event[i-1]+1. 

Как мне эффективно векторизовать это? Я хочу избежать петель.

Ответы [ 2 ]

5 голосов
/ 14 мая 2019

В своем определении ваших условий вы определяете выходы как зависящие от прошлых входов.Обычно это требует итерации.Однако, если вы думаете о своих выходах немного по-другому, а вместо этого просто учитываете значение change (1 или 0), вы можете векторизовать это с помощью numpy.select.

In.общее:

  • Если первое условие выполнено, увеличить Серию на 1
  • Если второе условие выполнено, оставить Серию такой же
  • В противном случае увеличитьСерии по 1

t = df.Time.lt(7)
n = df.nr.ne(df.nr.shift())

o = np.select([t & n, t & ~n], [1, 0], 1)
o[0] = 1                               # You say first value is 1
df.assign(Event=o.cumsum())

   nr  Time  Event
0  70     8      1
1  70     0      1
2  70     0      1
3  74    52      2
4  74    12      3
5  74     0      3
0 голосов
/ 14 мая 2019

У вас есть три условия. Хочу заметить, что у вас нет критериев, когда Время == 7?

Тем не менее, два из трех ваших критериев добавляют 1 к предыдущему Событию. Поэтому начните с создания столбца «Событие» равным 1, а затем измените значение для третьего критерия.

df['Event'] = 1

   nr  Time  Event
0  70     8      1
1  70     0      1
2  70     0      1
3  74    52      1
4  74    12      1
5  74     0      1

Затем отфильтруйте остальные критерии и установите для «Событие» значение 0

.
df.loc[(df['Time'] < 7) & (df['nr'] == df['nr'].shift(1)), 'Event'] = 0

  nr  Time  Event
0  70     8      1
1  70     0      0
2  70     0      0
3  74    52      1
4  74    12      1
5  74     0      0

Тогда cumum ()

df['Event'] = df['Event'].cumsum()

   nr  Time  Event
0  70     8      1
1  70     0      1
2  70     0      1
3  74    52      2
4  74    12      3
5  74     0      3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...