Примечание: см. РЕДАКТИРОВАТЬ ниже.
Мне нужно сохранить журнал всех строк, удаленных из моей 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