Как отфильтровать повторяющиеся группировки строк по индексу в кадре данных pandas? - PullRequest
0 голосов
/ 27 июня 2018

У меня путаница в отношении фильтрации и извлечения дублированных строк в кадре данных pandas. Например, рассмотрим:

   col1     col2      col3   col4  col5    ID

    1        yes        0      1      2    201
    2         0         1      0      0    203
    0         0         0      0      1    202
    0         0         0      0      2    202
    1        yes        0      3      4    201

Как я могу выбрать и расположить в другом фрейме данных панд все дублированные строки, которые имеют одинаковое связанное ID, без учета определенного количества столбцов, давайте для этого примера предположим, что последние 2 столбца (col4 и col5) ). Например, скажем, у меня есть (*):

   col1     col2      col3   col4  col5    ID

    1        yes        0      1      2    201
    1        yes        0      3      4    201
    0         0         0      0      1    202
    0         0         0      0      2    202
    2         0         1      0      0    203

Я знаю, что могу использовать для этого встроенные функции дубликаты и groupby . Тем не менее, так как я имею дело с большим количеством столбцов и строк, я не знаю, вернется ли это ко всем дублированным строкам, организованным так, как я хочу. Я пытался:

В:

temp2 = ['col4','col5']
# I am doing this because I have a lot of columns in my real dataset more than 800
a_lis = list(set(df.columns) - set(temp2))
a_lis

df.groupby(df['ID']).loc[df.duplicated(keep=False, subset=a_lis),:]

из

AttributeError: Cannot access callable attribute 'loc' of 'DataFrameGroupBy' objects, try using the 'apply' method

Моя путаница связана с параметром keep, я вообще не понимаю, как работает этот параметр. Таким образом, мой вопрос заключается в том, как правильно использовать groupby и параметр keep для получения (*)

1 Ответ

0 голосов
/ 28 июня 2018

Вам не нужно использовать groupby здесь. Просто используйте pd.DataFrame.loc. Помните, что groupby используется для агрегирования данных через функцию. Но вам кажется, что вам нужно reindex и поместить дублированные строки в верхней части вашего фрейма данных.

keep=False сохраняет все строки, имеющие дубликаты в другом месте в кадре данных, с учетом только столбцов в subset. В этом случае строка с индексом 1 будет удалена.

import numpy as np

# calculate duplicate indices
dup_index = df[df.duplicated(keep=False, subset=a_lis)].sort_values('ID').index

# calculate non-duplicate indices
non_dup_index = df.index.difference(dup_index)

# concatenate and reindex
res = df.reindex(np.hstack((dup_index.values, non_dup_index.values)))

print(res)

   col1 col2  col3  col4  col5   ID
0     1  yes     0     1     2  201
4     1  yes     0     3     4  201
2     0    0     0     0     1  202
3     0    0     0     0     2  202
1     2    0     1     0     0  203
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...