首页 > 解决方案 > 查找重复的行,将某个列乘以重复的数量,删除重复的行

问题描述

我有一个大约 70000 行的 pandas 数据框,其中 4500 行是原始数据的副本。这些列是字符串列和数字列的混合。我感兴趣的专栏是value专栏。我想查看整个数据框以找到完全相同的行,计算每行重复行的数量(包括原始行),并将value该行中的行数乘以重复行数。

我不确定如何从一开始就解决这个问题,但我尝试使用 df[df.duplicated(keep = False)] 来获取df1重复行(包括原始行)的数据框。我将一列 Trues 附加到df1. 我尝试使用 .groupby 与列的组合来总结 True 的数量,但结果无法捕获真实的重复数(在这种情况下,我获得了大约 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,我会得到一个空数据框。如果我不使用所有列,我不会得到真实的重复数量,我将无法以任何方式附加它。

我想我想要一个更好的方法来做到这一点,因为我让自己感到困惑。

标签: pythonpandasdataframeduplicates

解决方案


我认为这个问题只不过是弄清楚如何计算每个唯一行的出现次数。如果一行只出现一次,则此数字为一。如果它更频繁地发生,它将 > 1。然后您可以使用此计数来进行乘法、过滤等。

这个漂亮的单行(取自How to count duplicate rows in pandas dataframe?)创建了一个额外的列,其中包含每行的出现次数:

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]


推荐阅读