pandas 数据清洗 数据清洗是对一些没有用的数据进行处理的过程。 很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况,如果要对使数据分析更加准确,就需要对这些没有用的数据进行处理。
参考:
Pandas 数据清洗 | 菜鸟教程https://www.runoob.com/pandas/pandas-cleaning.html
'''
pandas 数据清洗
数据清洗是对一些没有用的数据进行处理的过程。
很多数据集存在数据缺失、数据格式错误、错误数据或重复数据的情况,如果要对使数据分析更加准确,就需要对这些没有用的数据进行处理。
'''
import pandas as pd
import numpy as np
# 测试DF,通过字典创建
data={'site':['google','google','runoob','baidu','wiki','baidu'],'age':[10,10,12,11,np.nan,13],'location':['loc1','loc1','cgu',np.nan,'loc2','loc3']}
#pandas.DataFrame( data, index, columns, dtype, copy)
df=pd.DataFrame (data)#数据载入到 DataFrame 对象
print(df)
'''
site age location
0 google 10.0 loc1
1 google 10.0 loc1
2 runoob 12.0 cgu
3 baidu 11.0 NaN
4 wiki NaN loc2
5 baidu 13.0 loc3
'''
#清洗空值
'''
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
axis:默认为 0,表示逢空值剔除整行,如果设置参数 axis=1 表示逢空值去掉整列。
how:默认为 'any' 如果一行(或一列)里任何一个数据有出现 NA 就去掉整行,如果设置 how='all' 一行(或列)都是 NA 才去掉这整行。
thresh:设置需要多少非空值的数据才可以保留下来的。
subset:设置想要检查的列。如果是多个列,可以使用列名的 list 作为参数。
inplace:如果设置 True,将计算得到的值直接覆盖之前的值并返回 None,修改的是源数据。
'''
print("判断age列空值的情况:\n",df['age'].isnull())
'''
判断age列空值的情况:
0 False
1 False
2 False
3 False
4 True
5 False
Name: age, dtype: bool
'''
#删除包含空数据的行
new_df=df.dropna(subset=["age"],inplace=False)
print("删除包含空数据的行df.dropna:\n",new_df.to_string())
'''
删除包含空数据的行df.dropna:
site age location
0 google 10.0 loc1
1 google 10.0 loc1
2 runoob 12.0 cgu
3 baidu 11.0 NaN
5 baidu 13.0 loc3
'''
#替换空字段
df.fillna(12345,inplace=True)
print("替换空字段df.fillna:\n",df.to_string())
'''
替换空字段df.fillna:
site age location
0 google 10.0 loc1
1 google 10.0 loc1
2 runoob 12.0 cgu
3 baidu 11.0 12345
4 wiki 12345.0 loc2
5 baidu 13.0 loc3
'''
#指定某一个列来替换数据
df_rep2=df['age'].fillna(1111,inplace=False)
print("指定列替换空字段df['age'].fillna:\n",df_rep2.to_string())
'''
指定列替换空字段df['age'].fillna:
0 10.0
1 10.0
2 12.0
3 11.0
4 1111.0
5 13.0
'''
#删除重复数据
df_dup=df.drop_duplicates(inplace=False)
print("删除重复数据df.drop_duplicates:\n",df_dup.to_string())
'''
删除重复数据df.drop_duplicates:
site age location
0 google 10.0 loc1
2 runoob 12.0 cgu
3 baidu 11.0 12345
4 wiki 12345.0 loc2
5 baidu 13.0 loc3
'''
for x in df.index:
if df.loc[x,"age"]>100:
df.loc[x,"age"]=100
print("age 大于 100 的设置为 100:\n",df.to_string())
'''
age 大于 100 的设置为 100:
site age location
0 google 10.0 loc1
1 google 10.0 loc1
2 runoob 12.0 cgu
3 baidu 11.0 12345
4 wiki 100.0 loc2
5 baidu 13.0 loc3
'''
#删除location时数字的行
for x in df.index:
if(str(df.loc[x,"location"]).isdigit()):
df.drop(x, inplace=True)
print("删除location时数字的行:\n",df.to_string())
'''
删除location时数字的行:
site age location
0 google 10.0 loc1
1 google 10.0 loc1
2 runoob 12.0 cgu
4 wiki 100.0 loc2
5 baidu 13.0 loc3
'''