Панды: заполнить столбец между 2 значениями, если условие истинно - PullRequest
2 голосов
/ 25 сентября 2019

У меня есть некоторые данные, в которых мне нужно подсчитать количество километров, пройденных транспортным средством, в то время как другое условие - Истина.

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

Итак, я хочу добавить серию, которая заполняет строки последним известным состоянием.Поэтому, если транспортное средство 1 открывает левое переднее окно, я бы затем установил серию в True, пока окно снова не закроется.Тогда я бы как-то (это я тоже не понял) вычислил количество километров, которое машина 1 проехала, когда было открыто левое переднее окно.

И тогда я бы сделал то же самое для правого окна и для всех транспортных средств..

Ниже приведен пример данных, и

import pandas as pd

matrix = [(1, 'Front Left Window Open', True),
         (2, 'Engine Started', True),
         (3, 'Engine Started', True),
         (4, 'Front Left Window Open', True),
         (1, 'Engine Started', True),
         (2, 'Engine Started', True),
         (3, 'Engine Started', True),
         (1, 'Odometer', 254),
         (1, 'Engine Started', True),
         (2, 'Engine Started', True),
         (3, 'Engine Started', True),
         (1, 'Front Right Window Open', True),
         (1, 'Engine Started', True),
         (1, 'Odometer', 257),
         (3, 'Engine Started', True),
         (1, 'Odometer', 259),
         (1, 'Front Left Window Open', False),
         (1, 'Engine Started', True),
         (1, 'Odometer', 261),
         (3, 'Engine Started', True),
         (1, 'Front Left Window Open', True),
         (1, 'Odometer', 265),
         ]

# Create a DataFrame object
dfObj = pd.DataFrame(matrix, columns=['Vehicle', 'Event', 'State'])

print (dfObj)

state = [True,True,True,True,True,True, True, True, True, True, True, True, True, True, True,True, False, False, False, False, True, True]

dfObj["FrontLeftWindowOpen"] = state

print ("\n\n\n")

print (dfObj[dfObj.Vehicle == 1])

print ("\n\n\n")

matrix = [(1, 'Front Left Window Open', 5),
         (1, 'Front Right Window Open', 2),
         (2, 'Front Left Window Open', 15),
         (2, 'Front Right Window Open', 12)
         ]

# Create a DataFrame object
dfObj = pd.DataFrame(matrix, columns=['Vehicle', 'state', 'km'])

print (dfObj)

Вывод

    Vehicle                    Event  State
0         1   Front Left Window Open   True
1         2           Engine Started   True
2         3           Engine Started   True
3         4   Front Left Window Open   True
4         1           Engine Started   True
5         2           Engine Started   True
6         3           Engine Started   True
7         1                 Odometer    254
8         1           Engine Started   True
9         2           Engine Started   True
10        3           Engine Started   True
11        1  Front Right Window Open   True
12        1           Engine Started   True
13        1                 Odometer    257
14        3           Engine Started   True
15        1                 Odometer    259
16        1   Front Left Window Open  False
17        1           Engine Started   True
18        1                 Odometer    261
19        3           Engine Started   True
20        1   Front Left Window Open   True
21        1                 Odometer    265

Добавлен столбец с текущим состоянием левого переднего окна

    Vehicle                    Event  State  FrontLeftWindowOpen
0         1   Front Left Window Open   True                 True
4         1           Engine Started   True                 True
7         1                 Odometer    254                 True
8         1           Engine Started   True                 True
11        1  Front Right Window Open   True                 True
12        1           Engine Started   True                 True
13        1                 Odometer    257                 True
15        1                 Odometer    259                 True
16        1   Front Left Window Open  False                False
17        1           Engine Started   True                False
18        1                 Odometer    261                False
20        1   Front Left Window Open   True                 True
21        1                 Odometer    265                 True

И окончательные расчеты одометра всех транспортных средств с количеством пройденного ими километра с открытыми окнами с правой или левой стороны.

   Vehicle                    state  km
0        1   Front Left Window Open   5
1        1  Front Right Window Open   2
2        2   Front Left Window Open  15
3        2  Front Right Window Open  12

1 Ответ

1 голос
/ 25 сентября 2019

Использование .where и прямое заполнение:

df['LeftWindowOpen'] = df.State.where(df.Event.eq('Front Left Window Open')).ffill()

    Vehicle                    Event  State  FrontLeftWindowOpen
0         1   Front Left Window Open   True                 True
1         2           Engine Started   True                 True
2         3           Engine Started   True                 True
3         4   Front Left Window Open   True                 True
4         1           Engine Started   True                 True
5         2           Engine Started   True                 True
6         3           Engine Started   True                 True
7         1                 Odometer    254                 True
8         1           Engine Started   True                 True
9         2           Engine Started   True                 True
10        3           Engine Started   True                 True
11        1  Front Right Window Open   True                 True
12        1           Engine Started   True                 True
13        1                 Odometer    257                 True
14        3           Engine Started   True                 True
15        1                 Odometer    259                 True
16        1   Front Left Window Open  False                False
17        1           Engine Started   True                False
18        1                 Odometer    261                False
19        3           Engine Started   True                False
20        1   Front Left Window Open   True                 True
21        1                 Odometer    265                 True

Для анализа на транспортное средство вы можете использовать groupby и ту же логику

df.groupby('Vehicle')[['Event', 'State']]\
  .apply(lambda s: s['State'].where(s['Event'].eq('Front Left Window Open'))\
                             .reindex(df.index)\
                             .ffill()
         )

State      0     1     2     3     4   ...     17     18     19    20    21
Vehicle                                ...                                 
1        True  True  True  True  True  ...  False  False  False  True  True
2         NaN   NaN   NaN   NaN   NaN  ...    NaN    NaN    NaN   NaN   NaN
3         NaN   NaN   NaN   NaN   NaN  ...    NaN    NaN    NaN   NaN   NaN
4         NaN   NaN   NaN  True  True  ...   True   True   True  True  True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...