pandas处理重复值、缺失值、异常值

一、drop_duplicates() 去重

# 语法:
drop_duplicates(subset=None, keep=‘first’, inplace=False, ignore_index=False)

参数:
subset: 设置根据列的子集来判断重复值,默认根据DataFrame的所有列来判断重复值,即所有列的数据都相同时,才算重复值。如果指定了子集,则只要子集的这些列的数据都相同,就算重复值。
keep: 设置保留重复值中的哪一个,可以设置的值有{‘first’, ‘last’, False},默认first,如果有重复值,则保留第一个。设置为last,则保留重复值中的最后一个。设置为False,则删除所有的重复值,一个也不保留。
inplace: 作用同drop(),值为True时,直接修改原数据,不返回
ignore_index: 设置是否忽略行索引,默认False,去重后的结果的行索引保持原索引不变。如果设置为True,则结果的行索引被重置为0开始的自然数。


# 示例:
df3 = pd.DataFrame(
    {'A': ['a0', 'a1', 'a1', 'a2', 'a2'],
     'B': ['b0', 'b1', 'b1', 'b2', 'b2'],
     'C': ['c0', 'c1', 'c1', 'c2', 'c3']},
    index=['one', 'two', 'three', 'four', 'five']
)

print(df3)
print('-'*20, '\n', df3.drop_duplicates(), sep='')  # 对比所有行,行与行内的所有列的值都相同则执行去重,默认保留第一行。two和three相同,所以删除了three这行
print('-'*20, '\n', df3.drop_duplicates(subset=['A', 'B']), sep='')  # 同时对比所有行A,B两列的值,行内的A、B列的值都相同则执行去重,默认保留第一行。two、three相同,four、five相同,所以删除了three 和 five两行。subset='A' ,就是按照A列的值去重
print('-'*20, '\n', df3.drop_duplicates(keep='last'), sep='')  # 对比所有行,行与行内的所有列的值都相同则执行去重,保留最后一行。two和three相同,所以删除了four 这行
print('-'*20, '\n', df3.drop_duplicates(keep=False), sep='')  # # 对比所有行,行与行内的所有列的值都相同则执行去重,不保留。two和three相同,所以删除了two和three两行
print('-'*20, '\n', df3.drop_duplicates(ignore_index=True), sep='')  # ignore_index 设置为True,结果的行索引被重置为0开始的自然数

"""
        A   B   C
one    a0  b0  c0
two    a1  b1  c1
three  a1  b1  c1
four   a2  b2  c2
five   a2  b2  c3
--------------------
       A   B   C
one   a0  b0  c0
two   a1  b1  c1
four  a2  b2  c2
five  a2  b2  c3
--------------------
       A   B   C
one   a0  b0  c0
two   a1  b1  c1
four  a2  b2  c2
--------------------
        A   B   C
one    a0  b0  c0
three  a1  b1  c1
four   a2  b2  c2
five   a2  b2  c3
--------------------
       A   B   C
one   a0  b0  c0
four  a2  b2  c2
five  a2  b2  c3
--------------------
    A   B   C
0  a0  b0  c0
1  a1  b1  c1
2  a2  b2  c2
3  a2  b2  c3
"""

二、缺失值处理

  • 如果缺失值没有使用NaN标记,比如使用"?",则可以先用 data = data.replace(to_replace='?',value=np.nan)替换'?’ 为 np.nan,然后继续处理
  • 检测所有内容是否不存在nan,可以用np.all(df.notnull())判断,结果为True,则没有缺失值
1. 判断函数:
df.isnull().any(axis)  # 常用, 尽可能找到所有的空值。同 pd.isnull(df)
df.notnull().all(axis)  # 常用,尽可能找到所有的空值。同 pd.notnull(df)
            
    获取缺失值的标记方式(NaN或者其他标记方式)
    如果缺失值的标记方式是NaN
    判断数据中是否包含NaN:
     	df.isnull(),
     	df.notnull()

    2. 过滤函数
            df.dropna()  # 默认是删除有空的行

            df.dropna(axis=1)  # 删除有空的列

            df.dropna(how='any')  # 默认值,默认有空就会删除,注:不会修改原数据,需要接收返回值

            df.dropna(how='all', axis=1)  # 所有的值都为空(整行或整列为空),才删除

            df.dropna(inplace=True)  # inplace=True: 表示修改原数据

    3. 填充函数 Series/DataFrame
            df.fillna(value=100,inplace=True)  # 填充

            df.fillna(value=100, limit=1, inplace=True)# limit: 限制对应维度上填充的次数

            df.fillna(method='ffill')  # 用上面数据来填充自己

            df.fillna(method='bfill')  # 用下面数据来填充自己

            df.fillna(method='ffill', axis=1)  # 用左边数据来填充自己

            df.fillna(method='bfill', axis=1)  # 用右边数据来填充自己

二、映射

1) replace()函数:替换元素
2) map()函数: 适合处理某一单独的列
3) rename()函数:替换索引
4) apply()函数:既支持 Series,也支持 DataFrame,用于接收一个自定义函数,来处理数据

# 如:定义一个对yuwen 和lishi两列,求各自最大值-最小值的函数
d = df[['yuwen','lishi']].apply(lambda x:x.max()- x.min(),axis=0)  # df[['yuwen','lishi']]是df对象的一种取值方式,先列后行规则

5) transform()函数

三、异常值的检测和过滤

describe(): 查看每一列的描述性统计量

df.std() : 可以求得DataFrame对象每一列的标准差

df.drop(): 删除特定索引

unique() : 唯一,去重

query() : 按条件查询

df.sort_values(): 根据值排序

df.sort_index(): 根据索引排序

df.info(): 查看数据信息

四、抽样

  • 使用.take()函数排序
  • 可以借助np.random.permutation()函数随机排序
posted @ 2025-03-18 15:37  BigSun丶  阅读(306)  评论(0)    收藏  举报