注意:请参见下面的编辑。
我需要保留从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)
我发现了this解决另一种.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
平行,因此这可能不是获得所需结果的最佳方法。 / p>
编辑
我在这里重写了我的问题,以更精确地说明我想要的结果。
我从具有一个重复行的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开始的行,这些行被 not 删除了,因此我不想在删除日志中使用它们。它还包括索引2中的行两次。我只想要一次。
我想要什么:
print(df_droplog)
# Output:
col1 col2 col3
2 sth diff dupe row x
答案 0 :(得分:3)
有一个并行: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])
答案 1 :(得分:0)
由于只需要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])