删除跨列交换值的重复行

时间:2017-09-01 11:12:23

标签: python pandas dataframe duplicates

非常感谢您阅读。

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

非常感谢。

1 个答案:

答案 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

预期结果是什么!