Поиск сигналов включения / выключения или пар значений в соседних строках в кадре данных панд - PullRequest
0 голосов
/ 03 сентября 2018

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

df['On/Off'] = np.where(df[col] > value, 'On', 'Off')

для маркировки сигнала как включенного или выключенного (value устанавливается в зависимости от источника сигнала). Следующий код дает пример кадра данных, хотя и без фактических данных измерений:

df = pd.DataFrame({"Time/s" : np.arange(0,100,2),
               "On/Off" : ("Off")})
df.at[10:13,"On/Off"] = "On"
df.at[40:43,"On/Off"] = "On"
df.at[47:,"On/Off"] = "On"

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

Учитывая то, как организован фрейм данных, я думаю, что нужно спуститься вниз по строкам и найти пары строк, где столбец on/off читается как «выключен» в row n, тогда «вкл» в row_n+1 должен быть подходом, как в:

i =0  # <--- number of on/off pairings

if cycle = [row_n]='On'; [row_n+1]='Off':
    i=+1

Мой текущий план основан на ответе на это ( Панды перебирают пары строк DataFrame )

Я думаю, df.shift() предлагает потенциальный маршрут, генерируя 2 кадра данных, а затем сравнивая строки на предмет несовпадений, но кажется, что может быть более простой способ, возможно, с использованием itertools или pd.iterrows (и т. Д.).

Как обычно, любая помощь очень ценится.

1 Ответ

0 голосов
/ 03 сентября 2018

Используйте shift с eq (==) для сравнения значений, объедините логическую маску и последний счет True с на sum:

out = (df['On/Off'].shift(-1).eq('Off') & df['On/Off'].eq('On')).sum()

Другое решение:

out = (df['On/Off'].shift().eq('On') & df['On/Off'].eq('Off')).sum()

print (out )
2

Detail:

print ((df['On/Off'].shift().eq('On') & df['On/Off'].eq('Off')))

0     False
1     False
2     False
3     False
4     False
5     False
6     False
7     False
8     False
9     False
10    False
11    False
12    False
13    False
14     True
15    False
16    False
17    False
18    False
19    False
20    False
21    False
22    False
23    False
24    False
25    False
26    False
27    False
28    False
29    False
30    False
31    False
32    False
33    False
34    False
35    False
36    False
37    False
38    False
39    False
40    False
41    False
42    False
43    False
44     True
45    False
46    False
47    False
48    False
49    False
Name: On/Off, dtype: bool
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...