Python 删除值跨列交换的重复行

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

非常感谢你的阅读

我有一个大约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       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