Python 删除值跨列交换的重复行
非常感谢你的阅读 我有一个大约200000行46列的熊猫数据帧。其中23列以“_1”结尾,另23列以“_2”结尾。例如:Python 删除值跨列交换的重复行,python,pandas,dataframe,duplicates,Python,Pandas,Dataframe,Duplicates,非常感谢你的阅读 我有一个大约200000行46列的熊猫数据帧。其中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
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、Lastname_1和area_1中的组合值与所有其他行的forename_2、Lastname_2和area_2中的组合值进行比较
我想删除两个“副本”中的第二个(例如keep='first')
为了帮助解释,上面有两种情况需要删除副本:
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中实现吗
非常感谢。可能有更好的解决方案,但这里有一种方法,即拆分和重新组合数据帧以删除重复项,然后执行相反的操作,返回原始格式:
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
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