Как хранить строки, отброшенные с помощью `drop_duplicates`? - PullRequest
0 голосов
/ 01 февраля 2019

Примечание: см. РЕДАКТИРОВАТЬ ниже.

Мне нужно сохранить журнал всех строк, удаленных из моей df, но я не уверен, как их захватить.Журнал должен быть фреймом данных, который я могу обновлять для каждой операции .drop или .drop_duplicates.Вот 3 примера кода, для которого я хочу записать пропущенные строки:

df_jobs_by_user = df.drop_duplicates(subset=['owner', 'job_number'], keep='first')
df.drop(df.index[indexes], inplace=True)
df = df.drop(df[df.submission_time.dt.strftime('%Y') != '2018'].index)

Я нашел это решение для другого .drop случая, который использует pd.isnull для перекодированияpd.dropna и, следовательно, позволяет создать журнал до фактического удаления строк:

df.dropna(subset=['col2', 'col3']).equals(df.loc[~pd.isnull(df[['col2', 'col3']]).any(axis=1)])

Но при попытке адаптировать его к pd.drop_duplicates я обнаружил, что нетpd.isduplicate параллельно pd.isnull, так что, возможно, это не лучший способ добиться нужных мне результатов.


РЕДАКТИРОВАТЬ

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

Я начинаю с df, который имеет одну строку дубликата:

import pandas as pd
import numpy as np
df = pd.DataFrame([['whatever', 'dupe row', 'x'], ['idx 1', 'uniq row', np.nan], ['sth diff', 'dupe row', 'x']], columns=['col1', 'col2', 'col3'])
print(df)

# Output:
       col1      col2 col3
0  whatever  dupe row    x
1     idx 1  uniq row  NaN
2  sth diff  dupe row    x

Затем я реализую решение из jjp:

df_droplog = pd.DataFrame()
mask = df.duplicated(subset=['col2', 'col3'], keep='first')
df_keep = df.loc[~mask]
df_droplog = df.append(df.loc[mask])

Я печатаю результаты:

print(df_keep)
# Output:
       col1      col2 col3
0  whatever  dupe row    x
1     idx 1  uniq row  NaN

df_keep - это то, что я ожидаю и хочу.

print(df_droplog)
# Output:
       col1      col2 col3
0  whatever  dupe row    x
1     idx 1  uniq row  NaN
2  sth diff  dupe row    x
2  sth diff  dupe row    x

df_droplog - это не то, что я хочу.Он включает в себя строки из индекса 0 и индекса 1, которые были не удалены и которые поэтому я не хочу в моем журнале удаления.Он также включает строку из индекса 2 дважды.Я хочу это только один раз.

Что я хочу:

print(df_droplog)
# Output:
       col1      col2 col3
2  sth diff  dupe row    x

Ответы [ 2 ]

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

Поскольку вы хотите, чтобы в df_droplog были только дублированные строки, просто добавьте только те к пустому фрейму данных.То, что вы делали, добавляло их к исходному фрейму данных df.Попробуйте это,

df_droplog = pd.DataFrame()
mask = df.duplicated(subset=['col2', 'col3'], keep='first')
df_keep = df.loc[~mask]
df_droplog = df_droplog.append(df.loc[mask])
0 голосов
/ 01 февраля 2019

Существует параллель: pd.DataFrame.duplicated возвращает логический ряд.Вы можете использовать его следующим образом:

df_droplog = pd.DataFrame()

mask = df.duplicated(subset=['owner', 'job_number'], keep='first')
df_jobs_by_user = df.loc[~mask]

df_droplog = df_droplog.append(df.loc[mask])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...