我正在研究重复数据删除问题,并希望比较具有一些共同字段的不同行。
例如,
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
答案 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。