繁体   English   中英

熊猫如何存储使用`drop_duplicates`删除的行?

[英]pandas How to store rows dropped using `drop_duplicates`?

注意:请参见下面的编辑。

我需要保留从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

有一个并行: 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])

由于只需要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])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM