Cha*_*210 5 python duplicates dataframe pandas
非常感谢阅读。
我有一个大约 200,000 行和 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
Run Code Online (Sandbox Code Playgroud)
我已经使用 drop_duplicates 成功删除了重复项,但现在想要删除重复的行,但它们所在的组(1 或 2)已被反转。
也就是说,对于一行,我想将forename_1、surname_1 和area_1 中的组合值与所有其他行的forename_2、surname_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
Run Code Online (Sandbox Code Playgroud)
在每种情况下,两者中的第二行将被删除,这意味着我的预期输出将是:
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
Run Code Online (Sandbox Code Playgroud)
我在 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
Run Code Online (Sandbox Code Playgroud)
让我们标记这些行,以便稍后可以将它们正确地合并在一起:
In [57]: df['index'] = df.index
Run Code Online (Sandbox Code Playgroud)
现在我们分割数据框,并重命名列:
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
Run Code Online (Sandbox Code Playgroud)
让我们合并数据集,并删除重复项(由于“索引”排序,我们保留第一个值)。
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
Run Code Online (Sandbox Code Playgroud)
看起来不错,不需要的行消失了!现在我们将所有内容合并在一起(根据您的用例,您可能需要使用不同类型的联接,请参阅合并文档):
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
Run Code Online (Sandbox Code Playgroud)
这是预期的结果!
| 归档时间: |
|
| 查看次数: |
730 次 |
| 最近记录: |