Как я могу проверить сходство между строками в кадре данных и добавить столбец в качестве счетчика и inc. это когда строки совпадают? - PullRequest
0 голосов
/ 07 мая 2018

Немного нового в python (Pandas), пожалуйста, помогите мне решить эту проблему

Вот так выглядит мой фрейм данных: - Device_id - это идентификатор устройства, которое показывает (Msg) в момент (1524724677), время в эпоху.

  Device_Id    Msg                Time
0  ABC123     connected        1524724677
1  ABC123     connected        1524724679
2  XYZ123     device failed    1524724814
3  ABC123     connected        1524725279
4  XVZ123     device failed    1524725300
5  PQR123      error           1524725325
6  ABC123     connected        1524725345

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

датафрейм, который я хочу, будет выглядеть так: -

  Device_Id    Msg                Time       count
0  ABC123     connected        1524724677      1
1  ABC123     connected        1524724679      2
2  XYZ123     device failed    1524724814      1
3  ABC123     connected        1524725279      1
4  XVZ123     device failed    1524725300      1
5  PQR123      error           1524725325      1
6  ABC123     connected        1524725345      2      

Этот столбец подсчета работает как для примера:

Пожалуйста, прочитайте все пункты, чтобы понять, как работает столбец подсчета

--for row(0) count is (1), bcoz this is the unique device
--we will increase the counter w.r.t (Time)
--we will reset the counter values after every 10 minutes
--for row(1) count is (2), bcoz time (1524724679) is between 
  1524724677 and 1524724677 + 10 minutes.
--for row(2), it is unique device and time(1524724679) 
  between 1524724677 and 1524724677 + 10 minutes  so count is (1).
--for row(3), notice it is not unique device then also it has count=1 
  bcoz, time(1524725279) is not between 1524724677 and 1524724677 + 10 
  minutes. (Count reset)
--for col(4) count is (1), bcoz time (1524725300) is between 
  1524725279 and 1524725279 + 10 minutes.
--for col(5), count=1, unique device and time (1524725325) between 1524725279 
  and 1524725279 + 10 minutes.
--for col(6) count=2, bcoz time(1524725345) is between 1524725279 
  and 1524725279 + 10 minutes.

Значения счетчика будут сбрасываться через каждые 10 минут, что означает, что они будут начинаться с (1) для каждого идентификатора устройства.

через каждые 10 минут каждый уникальный идентификатор_устройства будет считаться новым, поэтому счет начинается снова с 1 и сохраняет свое значение в течение следующих 10 минут.

1 Ответ

0 голосов
/ 07 мая 2018

Вы можете использовать функции groupby и grouper, чтобы легко решить эту проблему:

# convert time
df['Time'] = pd.to_datetime(df['Time'], unit='s')

# get output
df['count'] = df.groupby(['Device_Id', pd.Grouper(key='Time', freq='10min')]).cumcount()+1

print(df)

  Device_Id            Msg                Time  count
0    ABC123      connected 2018-04-26 06:37:57      1
1    ABC123      connected 2018-04-26 06:37:59      2
2    XYZ123  device failed 2018-04-26 06:40:14      1
3    ABC123      connected 2018-04-26 06:47:59      1
4    XVZ123  device failed 2018-04-26 06:48:20      1
5    PQR123          error 2018-04-26 06:48:45      1
6    ABC123      connected 2018-04-26 06:49:05      2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...