pandas查询列出现过哪些数值_pandas数据清洗

52c11a15e242f4ccf1026670e81c707a.png


0、前言 数据清洗主要包含以下几方面内容:
  • 处理缺失值

  • 处理重复值

  • 处理异常值


1、准备数据

import numpy as npimport pandas as pdimport pymysqlimport warningswarnings.filterwarnings("ignore")#查看某个函数、方法的详细使用。如输入pd.read_csv,然后按shift+tab(4次)#连接数据库(mysql)con = pymysql.connect(host = '127.0.0.1',port=3306,                     user='root',passwd='131129',db='znf',                      use_unicode=True,charset='utf8')# 查询数据sql = '''SELECT              产品编号,            单位,            规格,            售价,            是否赠品,            创建时间        FROM             在售产品; '''# 执行查询df = pd.read_sql_query(sql,con = con)#随机抽取5行display(df.sample(5))#查询每一列的数据类型print(df.dtypes,"\n------------")print(df["创建时间"].dtypes,"\n------------")#查询表格大小print(df.shape,"\n------------")#查询是否有空值print(df.info(),"\n------------")#获取基本统计信息,下图2display(df.describe())

915e838944fbd6fb10e550df68c34b2a.png

4cd07bf95c9a276d92f2e68cdb99cb9f.png


2、缺失值处理

2.1、发现缺失值

Pandas中,会将float类型的nan与None视为缺失值,我们可以通过如下方法来检测缺失值:
  • info()
  • isnull()
  • notnull()
说明:
  • 判断是否存在空值,可以将isnull与any或all结合使用。
2.2 检测整体缺失值情况 df.shape和df.info()
print("行列数:",df.shape)# 按照列来检测缺失值,首先可以调用info方法进行整体查看。# info方法可以显示DataFrame中每列的相关信息。print(df.info())

5e7848e5096e3611f984e4d736d41034.png

2.3 判断空值的情况
print(df.isnull().any() ,"\n") #按列检查每列是否有至少一个空print(df.iloc[:,3:4].isnull().any() ,"\n") #检查指定列是否有至少一个空print(df.notnull().all() ,"\n") #按列检查每列是否全部不为空print(df.iloc[:,3:4].notnull().all() ,"\n")  #按列检查指定列是否全部不为空

829c8a4005f6a50f8033b50991e78cd0.png

2.4 丢弃缺失值

df.dropna(axis=0/1,inplace=True/False,how='any' / how='all' / thresh=n)

说明:

  • axis:指定丢弃行或者丢弃列(默认为丢弃行axis = 0)。axis=0 / axis=1

  • inplace:指定是否就地修改,默认为False。是否就地操作

  • how:指定dropna丢弃缺失值的行为,默认为any(只要存在就删除)。all (该行(列)全部为空才删除)/ any

  • thresh:当非空数值达到该值时,保留数据,否则删除。如 thresh = 3,弥补how的不足(与how不同时使用)

# 处理空值。丢弃空值,使用dropna。df1 = df.dropna() #默认<=>df2,# 这个行为表示:把df中的 有缺失字段值的任意一行都删掉,但不使用就地删除# <=> df1 = df.dropna(axis=0,inplace=False,how='any')print(df1.info() ,"\n")   #处理后df1已经删除了有空值的行print(df.info())   #由于inplace=False,所以df不变,后续继续处理和运算使用df1

8d00aeb93a7dfee19069646d3a73ef5e.png

dc98530246fd147a6de75aa423046d59.png

2.5 填充缺失值

df.fillna(value / method ='ffill' [,limit=n] / method='bfill' [,limit=n] ,[inplace=True/False])

说明:

  • value:填充所使用的值。固定值填充,支持直接输入值,支持字典,支持Series,需要注意的是字典的key值,Series的index要与df的列名称对应。

  • method:指定前值(上一个有效值)填充(pad / ffill),还是后值(下一个有效值)填充(backfill / bfill)。

  • limit:如果指定method,表示最大连续NaN的填充数量,如果没有指定method,则表示最大的NaN填充数量。

  • inplace:指定是否就地修改,默认为False。

这些参数都很常用,联合起来控制进行替换的规则

display(df[22:26])#向下填充df1 = df.fillna(method="ffill",inplace=False)display(df1[22:26])#向上填充df2 = df.fillna(method='bfill',inplace=False)display(df2[22:26])# limit参数。如果指定method,则表示最多连续填充。# 如果没有指定method,则表示总共填充。df3 = df.fillna(method="bfill", limit=1)display(df3[22:26])#填充值df4 = df.fillna('空值')display(df4[22:26])

40c54a65e822b3ca4a59a5e807538e14.png

display(df[22:26])#向下填充df1 = df.fillna(method="ffill",inplace=False)display(df1[22:26])#向上填充df2 = df.fillna(method='bfill',inplace=False)display(df2[22:26])# limit参数。如果指定method,则表示最多连续填充。# 如果没有指定method,则表示总共填充。df3 = df.fillna(method="bfill", limit=1)display(df3[22:26])#填充值df4 = df.fillna('空值')display(df4[22:26])

2b6eefddde6775879833ba956c00d615.png


3、重复值处理

在处理数据中,可能会出现重复的数据,我们通常需要将重复的记录删除。

3.1 发现重复值

我们可以通过duplicated方法来发现重复值。该方法返回Series类型的对象,值为布尔类型,表示是否与上一行重复。 r = df[df.duplicated( [subset=[0,1,...],keep='first'/'last'/False)] )] display(r.sort_values([1,0,...], axis=0)) 参数说明:
  • subset:指定依据哪些列判断是否重复,默认为所有列。
  • keep:指定记录被标记为重复(True)的规则。默认为first。
#默认不加参数的情况# 检测重复值,这个函数的作用就是把每一行都映射成一个True或者false的结果# 如果结果为True 表示:这一行跟某一行重复了。默认全部字段重复才算重复display(df.duplicated().sample(5))display(df[df.duplicated()])  #这样输出的只是判断为True行

e06948b6e54888ab825063360fb1398a.png

#指定标记重复记录的规则result = df[df.duplicated(['单位','规格'],keep=False)]# <==> result = df[df.duplicated(subset=['单位','规格'],keep=False)]  #自定义用于判断重复的列display(result.sort_values(['单位','规格'], axis=0)) #排序

407831ef2e32181f656aade98a2de32a.png

3.2 删除重复值

通过drop_duplicates可以删除重复值。 df.drop_duplicates([subset=[0,1,...], keep='first'/'last', inplace=Ture/False]) 参数说明:
  • subset:指定依据哪些列判断是否重复,默认为所有列。

  • keep:指定记录删除(或保留)的规则。默认为first,所以一般不要再自行指定keep啦。

  • inplace:指定是否就地修改,默认为False。

  • #如果想了解关于当前这个方法的更多参数。怎么办?
    df.drop_duplicates
    # 按组合键:shift + tab 建   4次

# ['单位','规格'] 这两列同时重复的删除r = df[df.duplicated(subset=['单位','规格'])]print(r.shape)   #获取重复值df1 = df.drop_duplicates(subset=['单位','规格'],keep='first',inplace=False)print(df1.shape)  #删除重复制后的结果print(df.shape)

75c7104ffbccb7ef575c81082fec46b1.png


4、无效值处理

4.1检测无效值

可以通过DataFrame对象的describe方法查看数据的统计信息。不同类型的列,统计信息也不太相同。 无效值,跟缺失值的意思大致差不多,但是包含的范围更广泛 如:男 女 男 女 0 (1)、获取统计信息
  • df.describe() 获取数值列统计信息

  • df[[0,1,2]].describe()  获取指定的非数值列统计信息

  • df.shape 获取行列数量 

  • df.info() 获取缺失值信息

display(df.describe()) #如果DataFrame当中存在数值列,则describe值显示数值列。# describe()默认的规则:只针对数值列进行统计  describe() 描述   把数据的整体情况进行汇总汇报# 数值列的统计与非数值列的统计,结果不同。display(df.iloc[:,1:3].describe()) # 数值列 和 非数值列  的统计结果不一样!display(df.shape) #行列个数display(df.info()) #查看各列元素缺失值情况
5fa5ffa996a85c57ec3cc9f784f4fdb2.png (2)、根据统计信息,先处理缺失值(删除dropna,填充fillna)
  • df.dropna(axis=0/1,inplace=True/False,how='any' / how='all' / thresh=n)

  • df.fillna(value / method ='ffill' [,limit=n] / method='bfill' [,limit=n] ,[inplace=True/False])

(3)、处理重复值(查询重复duplicated,删除重复drop_duplicates)
  • r = df[df.duplicated( [subset=[0,1,...],keep='first'/'last'/False)] )]

  • display(r.sort_values([1,0,...], axis=0))

  • df1=df.drop_duplicates([subset=[0,1,...],keep='first'/'last', inplace=Ture/False])

(4)、处理其他异常值(错误数据替换......)
display(df.iloc[26:30])df['单位1'] = df['单位'] # 养成不要原地修改的习惯df["单位1"][df["单位1"]=="1"]="A"display(df.iloc[26:30])

0e3000cebc07f777bbea5486d3f82a10.png

display(df.head(5))df['是否赠品1'] = df['是否赠品'] # 养成不要原地修改的习惯df['是否赠品1'][df['是否赠品1']=="是"]=1df['是否赠品1'][df['是否赠品1']=="否"]=0display(df.head(5))

8e8c2b0f3409090edd1d86d5912e8a62.png

4d5ded3525cfa1cba4136c4ed0f76329.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值