Search code examples
pythonpandasfiltergroup-byduplicates

Drop duplicates using pandas groupby


In the dataframe below, I would like to eliminate the duplicate cid values so the output from df.groupby('date').cid.size() matches the output from df.groupby('date').cid.nunique().

I have looked at this post but it does not seem to have a solid solution to the problem.

df = pd.read_csv('https://raw.githubusercontent.com/108michael/ms_thesis/master/crsp.dime.mpl.df')
df.groupby('date')['cid'].agg(['size', 'nunique'])

       size  nunique
date        
2005      7        3
2006    237       10
2007   3610      227
2008   1318       52
2009   2664      142
2010    997       57
2011   6390      219
2012   2904      99
2013    7875    238
2014    3979    146

Things I tried:

  1. df.groupby([df['date']]).drop_duplicates(cols='cid') gives this error: AttributeError: Cannot access callable attribute 'drop_duplicates' of 'DataFrameGroupBy' objects, try using the 'apply' method
  2. df.groupby(('date').drop_duplicates('cid')) gives this error: AttributeError: 'str' object has no attribute 'drop_duplicates'

Solution

  • You don't need groupby to drop duplicates based on a few columns, you can specify a subset instead:

    df2 = df.drop_duplicates(["date", "cid"])
    df2.groupby('date').cid.size()
    Out[99]: 
    date
    2005      3
    2006     10
    2007    227
    2008     52
    2009    142
    2010     57
    2011    219
    2012     99
    2013    238
    2014    146
    dtype: int64