非常感谢您阅读。
我有一个大约200,000行和46列的pandas数据帧。其中23列以" _1"而另外23个结束于" _2"。例如:
forename_1 surname_1 area_1 forename_2 surname_2 area_2
george neil g jim bob k
charlie david s graham josh l
pete keith k dan joe q
ben steve w richard ed p
jim bob k george neil g
dan joe q pete keith k
我已使用drop_duplicates成功删除了重复项,但现在想要删除重复的行,但它们所在的组(1或2)已被反转。
也就是说,对于一行,我想将forename_1,surname_1和area_1中的组合值与forename_2,surname_2和area_2中所有其他行的组合值进行比较。
我想删除第二个'重复的'两个中的一个(例如,保持='第一个')。
为了帮助解释,上面有两种情况需要删除副本:
george neil g jim bob k
jim bob k george neil g
pete keith k dan joe q
dan joe q pete keith k
在每种情况下,两个中的第二行都将被删除,这意味着我的预期输出将是:
forename_1 surname_1 area_1 forename_2 surname_2 area_2
george neil g jim bob k
charlie david s graham josh l
pete keith k dan joe q
ben steve w richard ed p
我在R中看到了一个解决这个问题的答案,但是还有一种方法可以在Python中完成吗?
Compare group of two columns and return index matches R
Remove duplicates where values are swapped across 2 columns in R
非常感谢。
答案 0 :(得分:2)
可能有一个更好的解决方案,但是这里有一个拆分并重新组合数据帧以删除重复项,然后执行相反的操作,返回原始格式:
In [43]: df
Out[43]:
forename_1 surname_1 area_1 forename_2 surname_2 area_2
0 george neil g jim bob k
1 charlie david s graham josh l
2 pete keith k dan joe q
3 ben steve w richard ed p
4 jim bob k george neil g
5 dan joe q pete keith k
让我们标记行,以便我们稍后可以将它们合并在一起:
In [57]: df['index'] = df.index
现在我们拆分数据框,并重命名列:
In [59]: df_1 = df[['forename_1', 'surname_1', 'area_1', 'index']]
In [60]: df_2 = df[['forename_2', 'surname_2', 'area_2', 'index']]
In [61]: df_1.columns = ['forename', 'surname', 'area', 'index']
In [62]: df_2.columns = ['forename', 'surname', 'area', 'index']
In [63]: df_1['source'] = 1
In [64]: df_2['source'] = 2
让我们合并数据集,并删除重复项(感谢"索引"排序,我们保留第一个值。)
In [67]: df = pd.concat([df_1, df_2])
In [68]: df
Out[68]:
forename surname area index source
0 george neil g 0 1
1 charlie david s 1 1
2 pete keith k 2 1
3 ben steve w 3 1
4 jim bob k 4 1
5 dan joe q 5 1
0 jim bob k 0 2
1 graham josh l 1 2
2 dan joe q 2 2
3 richard ed p 3 2
4 george neil g 4 2
5 pete keith k 5 2
In [71]: out = df.sort_values(['index']).drop_duplicates(['forename', 'surname', 'area'], keep='first')
In [72]: out
Out[72]:
forename surname area index source
0 george neil g 0 1
0 jim bob k 0 2
1 charlie david s 1 1
1 graham josh l 1 2
2 pete keith k 2 1
2 dan joe q 2 2
3 ben steve w 3 1
3 richard ed p 3 2
找钱'好的,不受欢迎的行消失了!现在我们将所有内容合并在一起(根据您的使用案例,您可能需要使用不同类型的联接,请参阅merge documentation):
In [76]: df_1_out = out[out['source'] == 1][['forename', 'surname', 'area', 'index']]
In [77]: df_2_out = out[out['source'] == 2][['forename', 'surname', 'area', 'index']]
In [82]: df_1_out.merge(df_2_out, on='index', suffixes=('_1', '_2')).drop('index', axis=1)
Out[82]:
forename_1 surname_1 area_1 forename_2 surname_2 area_2
0 george neil g jim bob k
1 charlie david s graham josh l
2 pete keith k dan joe q
3 ben steve w richard ed p
预期结果是什么!