【问题标题】:Create blocks in pandas for deduplication在 pandas 中创建块以进行重复数据删除
【发布时间】:2017-10-19 06:49:18
【问题描述】:

我正在处理重复数据删除问题,并希望比较具有某些共同字段的不同行。

例如,

import pandas as pd

d = {
         'Name': ['Sam', 'John', 'Christian', 'Sam', 'Christian'],
         'Phone': [900, 800, 700, 600, 500],
         'City': ['a', 'b', 'c', 'd', 'e']
    }
df = pd.DataFrame(d)

df

City    Name        Phone
a       Sam         900
b       John        800
c       Christian   700
d       Sam         600
e       Christian   500

在此数据框中,行 (1,4) 和 (3,5) 具有相同的名称,并且是我的潜在重复项。如何创建“名称”匹配的行对?

预期输出

Name1      City1 Phone1 Name2      City2 Phone2
Sam        a     900    Sam        d     600
Christian  c     700    Christian  e     500

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    希望对你有帮助

    pd.concat([df1[1].reset_index(drop=True).add_suffix(i+1) for i,df1 in enumerate(df[df.duplicated('Name',keep=False)].groupby('Name',as_index=False))],axis=1)
    Out[218]: 
      City1      Name1  Phone1 City2 Name2  Phone2
    0     c  Christian     700     a   Sam     900
    1     e  Christian     500     d   Sam     600
    

    编辑:这似乎是你想要的

    df1=df[df.duplicated('Name',keep=False)]
    df1['G']=df1.groupby('Name').cumcount().add(1)
    pd.concat([df1.reset_index(drop=True).drop('G',1).add_suffix(i) for i,df1 in df1.groupby('G')],axis=1)
    
    
    Out[308]: 
      City1      Name1  Phone1 City2      Name2  Phone2
    0     a        Sam     900     d        Sam     600
    1     c  Christian     700     e  Christian     500
    

    【讨论】:

      【解决方案2】:

      您应该将DataFrame.groupby 与某种聚合函数一起使用。一种选择是

      def aggregate(rows):
          result = {}
          for index, dict_ in enumerate(rows.apply(dict, 1)):
              result.update({'{}{}'.format(key, index + 1): value for key, value in dict_.iteritems()})
          return pd.Series(result)
      
      df.groupby('Name').filter(lambda g: len(g) > 1).groupby('Name').apply(aggregate).reset_index(drop=True)
      
        City1 City2      Name1      Name2  Phone1  Phone2
      0     c     e  Christian  Christian     700     500
      1     a     d        Sam        Sam     900     600
      

      【讨论】:

        【解决方案3】:
        duplicates = pd.DataFrame()
        for row in df.itertuples():
        
            possible_dups = df[(df.Name == row.Name) & (df.index > row.Index)]
            duplicates = duplicates.append(pd.merge(possible_dups,df.loc[[row.Index],:],on='Name'))
        
        duplicates
        
        City_x  Name        Phone_x City_y  Phone_y
        0   d   Sam         600     a       900
        0   e   Christian   500     c       700
        

        我的低效解决方案 - 遍历行,找到重复行(索引更大且名称相同),合并行,然后将其附加到创建的 df 中。

        【讨论】:

          猜你喜欢
          • 2020-12-23
          • 2021-12-06
          • 2021-04-02
          • 1970-01-01
          • 2019-01-08
          • 1970-01-01
          • 2022-08-10
          • 1970-01-01
          • 2022-10-14
          相关资源
          最近更新 更多