В пандах, как проверить, соответствуют ли две строки нескольким столбцам в любой из строк в существующем фрейме данных, и удалить его. - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть фрейм данных, который выглядит следующим образом

                 rootID   parentID    jobID  time                         counter
              0    A         B          D    2019-01-30 14:33:21.339469      0
              1    E         F          G    2019-01-30 14:33:21.812381      0
              2    A         C          D    2019-01-30 15:33:21.812381      0
              3    E         B          F    2019-01-30 15:33:21.812381      0
              4    E         F          G    2019-01-30 16:33:21.812381      0

Я получу живые данные, а данные - это строка rootID, строка parentID, строка jobID и дата.

Я хочу проверить, существует ли уже найденная комбинация rootID и parentID в кадре данных.Поэтому, если я получу rootID = "A" и parentID == "B", jobID == "T", я хочу получить доступ к первой строке кадра данных.Затем я хочу удалить эту строку, добавить новую информацию и увеличить счетчик обновлений.

         IF rootID and parentID exist in the same row in dataframe. 
         delete row and append new data with updated jobID and incremented counter. 

Теперь фрейм данных должен выглядеть так:

                 rootID   parentID    jobID  time                         counter
              0    E         F          G    2019-01-30 14:33:21.812381      0
              1    A         C          D    2019-01-30 15:33:21.812381      0
              2    E         B          F    2019-01-30 15:33:21.812381      0
              3    E         F          G    2019-01-30 16:33:21.812381      0
              4    A         B          T    2019-01-30 17:33:21.339469      1

Кто-нибудь знает, как это можно сделать?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Я бы

root_id, parent_id, job_id = get_ids() # e.g. ('A', 'B', 'T')

cond = df.rootID.eq(root_id) & df.parentID.eq(parent_id) & df.jobID.eq(job_id)

df.loc[cond, ['time', 'counter']] = datetime.datetime.now(), df.loc[cond, 'counter']+1

Это обновит ваш фрейм данных in_place.Я бы не переупорядочивал Dataframe все время, если бы он не был абсолютно необходим.Если вы можете, например, повторно сортировать его один раз в день, вы можете периодически просто

df.sort_values(by='time') #.reset_index(drop=True), if needed

.Однако, если вам абсолютно необходимо менять строки при каждом поступлении новых данных, то, если у вас есть уникальные идентификаторы,

df = pd.concat([df[df[cond].index.item()+1:], df[cond]]) 
0 голосов
/ 04 февраля 2019

Я думаю, что вы можете получить довольно близкое решение, просто переведя ваш пример:

for index, row in df.iterrows():
    if row['rootID'] == rootID and row['parentID'] == parentID:
        df.drop(df.iloc[index])
        row['time'] = datetime.datetime.now()
        row['counter'] += 1
        df = df.concat(row)

Без циклов:

selected_row = df[(df['rootId'] == rootID) & (df['parentID'] == parentID)])
df.drop(selected_row)
selected_row['time'] = datetime.datetime.now()
selected_row['counter'] += 1
df = df.concat(selected_row)

Предполагается, что у вас есть только одна строка, соответствующая rootID иискомая комбинация parentID.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...