Как чередовать значения в двух столбцах в кадре данных? - PullRequest
1 голос
/ 27 февраля 2020

Я пытаюсь создать два новых столбца для чередования начала и конца в кадре данных:

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

Как мог Я делаю это без использования l oop, поэтому с помощью функций numpy или pandas?

The code to create the dataframe :

df = pd.DataFrame({ 'start':[0,0,1,0,1,0,1,0,0,0,0,1,0,1,0,0,0,1,0],
                    'end':[1,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0]})
The render and the result I want :

   start  end  start wanted  end wanted
0       0    1             0           0
1       0    0             0           0
2       1    0             1           0
3       0    0             0           0
4       1    0             0           0
5       0    0             0           0
6       1    0             0           0
7       0    1             0           1
8       0    0             0           0
9       0    1             0           0
10      0    0             0           0
11      1    0             1           0
12      0    0             0           0
13      1    0             0           0
14      0    0             0           0
15      0    1             0           1
16      0    0             0           0
17      1    0             1           0
18      0    0             0           0

1 Ответ

1 голос
/ 27 февраля 2020

Я не знаю, как это сделать с чистыми пандами / numpy, но вот простое для l oop, которое дает ожидаемый результат. Я протестировал его с pandas фреймом данных, в 50 000 раз превышающим размер ваших примерных данных (всего около 1 миллиона строк), и он работает примерно за 1 секунду:

import pandas as pd

df = pd.DataFrame({ 'start':[0,0,1,0,1,0,1,0,0,0,0,1,0,1,0,0,0,1,0],
                    'end':[1,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0]})


start = False
start_wanted = []
end_wanted = []
for s, e in zip(df['start'], df['end']):
    if start:
        if e == 1:
            start = False
        start_wanted.append(0)
        end_wanted.append(e)
    else:
        if s == 1:
            start = True
        start_wanted.append(s)
        end_wanted.append(0)


df['start_wanted'] = start_wanted
df['end_wanted'] = end_wanted

print(df)

Вывод:

    end  start  start_wanted  end_wanted
0     1      0             0           0
1     0      0             0           0
2     0      1             1           0
3     0      0             0           0
4     0      1             0           0
5     0      0             0           0
6     0      1             0           0
7     1      0             0           1
8     0      0             0           0
9     1      0             0           0
10    0      0             0           0
11    0      1             1           0
12    0      0             0           0
13    0      1             0           0
14    0      0             0           0
15    1      0             0           1
16    0      0             0           0
17    0      1             1           0
18    0      0             0           0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...