查找重复的行,将某个列乘以重复的数量,删除重复的行

时间:2018-12-27 10:10:09

标签: python pandas dataframe duplicates

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

我从一开始就不太确定如何解决这个问题,但是我尝试使用df [df.duplicated(keep = False)]来获得重复行的数据帧df1(包括原始行)。我在df1的末尾附加了True列。我尝试将.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列中存储的数字。然后,在删除所有由.duplicated标识的重复项之后,我只需将df2附加到我的原始数据帧中。

但是,如果我对所有列都使用groupby,则会得到一个空的数据框。如果我不使用所有列,则不会获得真正的重复数,也无法以任何方式附加它。

我认为我希望有一种更好的方法,因为我很困惑。

1 个答案:

答案 0 :(得分:0)

我认为这个问题只不过是弄清楚如何对每个唯一行的出现次数进行计数。如果一行仅出现一次,则此数字为1。如果它出现的频率更高,则将是>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]