Поиск дублированных строк, умножение определенного столбца на количество дубликатов, удаление дублированных строк - PullRequest
0 голосов
/ 27 декабря 2018

У меня есть пандас данных около 70000 строк, и 4500 из них являются дубликатами оригинала.Столбцы представляют собой смесь строковых столбцов и числовых столбцов.Интересующий меня столбец - это столбец value.Я хотел бы просмотреть весь кадр данных, чтобы найти строки, которые полностью идентичны, посчитать количество дублированных строк в строке (включая оригинал) и умножить value в этой строке на количество дубликатов.

Я не совсем уверен, как это сделать с самого начала, но я пытался использовать df [df.duplicated (keep = False)] для получения кадра данных df1 дублированных строк (включительнооригинальных рядов).Я добавил колонку Истин до конца df1.Я пытался использовать .groupby с комбинацией столбцов для суммирования числа истин, но результат не смог уловить истинное количество дубликатов (в этом случае я получил около 3600 уникальных дублированных строк).

Вот мой фактический код:

duplicate_bool = df.duplicated(keep = False)
df['duplicate_bool'] = duplicate_bool
df1= df[duplicate_bool]
f = {'duplicate_bool':'sum'}
df2= df1.groupby(['Date', 'Exporter', 'Buyer', \
                       'Commodity Description', 'Partner Code', \
                       'Quantity', 'Price per MT'], as_index = False).agg(f)

Моя идея заключалась в том, чтобы получить отдельный фрейм данных df2 без дубликатов, и я мог бы умножить запись в столбце value внутри начисло хранится в суммированном столбце duplicate_bool.Затем я просто добавлю df2 к моему исходному фрейму данных после удаления всех дубликатов, идентифицированных с помощью .duplicated.

Однако, если я использую groupby со всеми столбцами, я получаю пустой фрейм данных.Если я не использую все столбцы, я не получу истинное количество дубликатов и не смогу добавить его каким-либо образом.

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

1 Ответ

0 голосов
/ 27 декабря 2018

Я думаю, что этот вопрос - не что иное, как выяснение того, как подсчитать вхождения каждой уникальной строки.Если строка встречается только один раз, это число равно единице.Если это будет происходить чаще, это будет> 1. Этот счетчик вы можете затем использовать для умножения, фильтрации и т. Д.

Этот хороший однострочный (взят из Как подсчитать повторяющиеся строки в кадре данных панд? ) создает дополнительный столбец с количеством вхождений каждой строки:

df = df.groupby(df.columns.tolist()).size().reset_index().rename(columns={0:'dup_count'}).

Чтобы затем вычислить истинное значение каждой строки:

df['total_value'] = df['value'] * df['dup_count']

И для фильтрации мы можем использовать столбец dup_count, чтобы удалить все повторяющиеся строки:

dff = df[df['dup_count'] == 1]

...