pandas的drop_duplicates无法去重问题解决
作者:羸弱的穷酸书生
之前没研究过pandas的去重方法,今天用了一下,发现这个方法并不是那么好用,我的需求是去除所有列的重复值,并保留第一个重复的值,按我的想法应该是下面这样写
import pandas as pd import numpy as np df1 = pd.DataFrame({ 'a':[1,1,float('nan'),1,4,5], 'b':[3,3,4,4,5,6], 'c':[4,4,5,5,6,7], }) df1 = df1.drop_duplicates(keep='first') df1
但是结果却不尽如人意,
a b c
0 1.0 3 4
2 NaN 4 5
3 1.0 4 5
4 4.0 5 6
5 5.0 6 7
如图所示,并没有删除重复值,所以我只能一个一个列的删,删完在重新拼接在一起,
import pandas as pd import numpy as np df1 = pd.DataFrame({ 'a':[1,1,float('nan'),1,4,5], 'b':[3,3,4,4,5,6], 'c':[4,4,5,5,6,7], }) cols = df1.columns.to_list() series_list = [] for col in cols: tmp_s = df1[col].drop_duplicates(keep='first') tmp_s = tmp_s.dropna() tmp_s = tmp_s.reset_index(drop=True) print(tmp_s) series_list.append(tmp_s) new_df = pd.concat(series_list,axis=1) new_df
结果
a b c
0 1.0 3 4
1 4.0 4 5
2 5.0 5 6
3 NaN 6 7
当然这样数据的索引是无法跟之前的对应起来了,所以我猜pandas是想保留之前的数据的对应关系的,一旦有操作要破坏这种对应,它就不会执行
drop_duplicates()官方的函数说明
解释一下各个参数:
subset:表示要去重的列名,默认为 None。
keep:有三个可选参数,分别是 first、last、False,默认为 first,表示只保留第一次出现的重复项,删除其余重复项,last 表示只保留最后一次出现的重复项,False 则表示删除所有重复项。
inplace:布尔值参数,默认为 False 表示删除重复项后返回一个副本,若为 Ture 则表示直接在原数据上删除重复项,改变了原来的数据框。
ignore_index:布尔值参数,默认为False,表示保留原来的行索引,若为True,则表示重新设置行索引。
到此这篇关于pandas的drop_duplicates无法去重问题解决的文章就介绍到这了,更多相关pandas的drop_duplicates无法去重内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!