在pandas中创建块以进行重复数据删除

时间:2017-10-18 21:24:18

标签: python pandas

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

例如,

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)具有相同的名称,是我可能的重复项。如何制作“' Name'匹配?

预期输出

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

3 个答案:

答案 0 :(得分:3)

希望有所帮助

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

答案 1 :(得分:1)

您应该将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

答案 2 :(得分:0)

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。