Python之数据清洗

Python之数据清洗

注:使用数据源—口袋妖怪数据集提取码s30w

一、检查数据

1、不清楚的数据

  • 列名不一致(大小字母或单次之间的空格)
  • 数据缺失
  • 语言不同

通常使用head,tail,columns,shape和info等函数来检查数据

# 数据清洗
import pandas as pd
# import numpy as np
data=pd.read_csv('..\data\pokemon\Pokemon.csv')
# 输出前五行数据
print('前五行数据:')
print(data.head(5))
# 输出最后三行数据
print('后三行数据')
print(data.tail(3))
# 查看列名
print('列名:',data.columns)
# 查看行数与列数
print('行数与列数:',data.shape)
# 展示index,datatype和memory相关信息
print('index,datatype和memory相关信息')
print(data.info())

运行结果
Python之数据清洗_第1张图片Python之数据清洗_第2张图片
Python之数据清洗_第3张图片
Python之数据清洗_第4张图片

二、EDA(探索性数据分析)

1.value_counts()与离群值

pandas中的一个函数,可以对series里面的每个值进行技术并且排序
离群值(outliers):也称溢出值,是指在数据中有一个或者几个其他数据相比差异较大

  • 小于 Q1 - 1.5(Q3-Q1) ,或大于 Q3 + 1.5(Q3-Q1)的值称为outliers。(Q1表示第一四分位数)
  • TQR代表四分位数间距,IQR=(Q3-Q1)

我们使用describe()函数总结数据集分布的中心趋势,常用的算术运算指标如下:

  • count: 计算每个条目出现的次数
  • mean: 平均值
  • std: 标准差
  • min: 最小值
  • 25%: 第一四分位数
  • 50%: 中位数
  • 75%: 第三四分位数
  • max: 最大值

注:什么是四分位数??
四分位数也称四分位点,是指在统计学中把所有数值由小到大排列并分成四等份,处于三个分割点位置的数值。多应用于统计学中的箱线图绘制。它是一组数据排序后处于25%和75%位置上的值。
四分位数是通过3个点将全部数据等分为4部分,其中每部分包含25%的数据。很显然,中间的四分位数就是中位数,因此通常所说的四分位数是指处在25%位置上的数值(称为第一四分位数)和处在75%位置上的数值(称为第三四分位数)。

举例:1,4,5,6,8,9,11,12,13,14,15,16,17

第二四分位数(中位数)Q2是序列中间的数字,即11;
第一四分位数Q1,是最小数字和中位数之间的中位数,也就是111之间的中位数,即6;
第三分位数Q3,是中位数和最大数之间的中位数,也就是1117之间的中位数,即14

看看不同类型口袋妖怪出现的频率

# EDA
import pandas as pd
data=pd.read_csv('..\data\pokemon\Pokemon.csv')
#dropna表示升序,为false表示降序,true为升序
print(data['Type 1'].value_counts(dropna=False))

运行结果
从运行结果可以看出水精灵的个数最多,有112个Python之数据清洗_第5张图片
可以通过describe()函数看出其他信息

print(data.describe())

Python之数据清洗_第6张图片

2.箱线图(box plot)

箱线图:可视化基本的统计数据,如离群值,最大、最小值,四分位值等

# 箱线图:可视化基本的统计数据:如离群值,最大最小值,四分位值
import pandas as pd
import matplotlib.pyplot as plt
data=pd.read_csv('..\data\pokemon\Pokemon.csv')
data.boxplot(column=['Attack','Defense'])
plt.show()

运行结果
Python之数据清洗_第7张图片
加入分类数据列‘Legendary’

data.boxplot(column='Attack',by='Legendary')

运行结果
Python之数据清洗_第8张图片

三、重塑数据

使用melt()函数来转换数据的行列。
语法:
pandas.melt(frame, id_vars=None, value_vars=None, var_name=None, value_name=‘value’, col_level=None)

参数:

  • frame:要处理的数据集
  • id_vars:不需要被转换的列名
  • value_vars:需要转换的列名,如果剩下的列全部都要转换,就不用写了
  • var_name和value_name是自定义设置对应的列名。
# 数据重塑
import pandas as pd
data=pd.read_csv('..\data\pokemon\Pokemon.csv')
data_new=data[10:15]#取10-14行数据来构建新的数据表
# print(data_new)
# 使用melt()函数
#frame:需要处理的数据集,id_vars:不需要转换的列名,value_vars:需要转换的列名
melted=pd.melt(frame=data_new,id_vars='Name',value_vars=['Attack','Defense'])
print(melted)

运行结果
Python之数据清洗_第9张图片

四、数据透视表

pivot()函数根据列值重塑数据,生成“数据透视表”
语法:
DataFrame.pivot_table(index=None, columns=None, values=None)
参数:

  • index: 重塑的新表的索引名称是什么
  • columns:重塑的新表的列名称是什么
  • values: 生成的新列中的值是什么
# 需求:根据上面的melted数据表生成一张新表,新表可以显示口袋妖怪的名字以及对应的防御值和攻击值
# index:重塑的新表的索引名称,columns:重塑的新标的列名称,values:生成的新列中的值是什么
melted_pivot=melted.pivot(index='Name',columns='variable',values='value')
print(melted_pivot)

运行结果
Python之数据清洗_第10张图片

五、数据连接

将两个dataframe连接在一起

# 数据连接:将两个dataframe连接在一起
import pandas as pd
data=pd.read_csv('..\data\pokemon\Pokemon.csv')
# 首先生成两个新的dataframe
# 分别取data的前三行和后三行数据
data1=data.head(3)
data2=data.tail(3)
# 使用comcat将两个dataframe连接在一起,axis=0表示行拼接,即纵向拼接
con_data_row=pd.concat([data1,data2],axis=0,ignore_index=True)
print(con_data_row)

运行结果
Python之数据清洗_第11张图片

data1=data['Attack'].head(3)
data2=data['Defense'].head(3)
#axis=1:列拼接,即横向拼接
conc_data_col=pd.concat([data1,data2],axis=1)
print(conc_data_col)

Python之数据清洗_第12张图片

六、数据类型转换

1.Python的基础数据类型

  • Number(数字):int、float、bool、complex
  • String(字符串)
  • List(列表)
  • Tuple(元组)
  • Set(集合)
  • Dictionary(字典)

不同的数据类型之间可以转换,例如将字符串转换为categorical数据(分类数据),或者将整数转换为浮点数

2.统计数据类型:Numerical 与 Categorical

Numerical data:这种数据类型具有实际测量的物理意义(例如一个人的身高、体重、血压等);或者是一个计量数字(比如一个人拥有多少股票,一只猫有多少颗牙齿等),统计学上也称其为定量数据(quantitative data)。
Numerical data可分为两类:离散型数据(discrete data)和连续型数据(continuous data)。

  • 离散型:离散数据无法测量但可以计数,具有可以列出的可能值。其可能值的列表可以是有限的,也可以是可数无穷的。例如,100次抛掷中正面的次数取值范围从0到100(有限情况),但得到100次正面所需的抛掷次数取值范围从100(最快的情况)到无穷大(如果永远不能得到第100次正面)。它的可能值被列出为100、101、102、103、……(表示可数无穷情况)
  • 连续型:连续数据表示测量值,它们的可能值不能计算,只能用实数轴上的间隔来描述。例如,一个油箱容量60L的汽车,在加油站购买的确切汽油量将是0L到60L之间的连续数据,用区间[0,60]表示。连续数据可以被认为是不可数的无限的。为了便于记录,统计人员通常会在数字中选取一个点进行四舍五入。
    Categorical data:分类数据表示特征,如一个人的性别,婚姻状况,家乡,或他们喜欢的电影类型。分类数据也可以是数值(例如“1”表示男性,“2”表示女性),但这些数字没有数学意义,比如你不能把它们加在一起。
# 查看数据类型
print(data.dtypes)

运行结果
Python之数据清洗_第13张图片

# 将str转换为categorical(分类数据),将int转换为float
data['Type 1']=data['Type 1'].astype('category')
data['Speed']=data['Speed'].astype('float')
print(data.dtypes)

运行结果
Python之数据清洗_第14张图片

七、数据缺失及断言

1.如果遇到缺失的数据(NaN)我们能做的事情有:

  • 放着不管
  • 使用dropna()函数删除他们
  • 用fillna()函数填充缺失值
  • 用平均值之类的统计数据填充缺失值
    assert: Python中assert用来判断语句的真假,如果为假的话将触发AssertionError错误
# 查看pokemon数据集是否存在NAN值
print(data.info())

Python之数据清洗_第15张图片
800个条目中,type2 只有414个非空对象,有386个空

# 单独将type2提出来验证上述
print(data['Type 2'].value_counts(dropna=False))

运行结果
Python之数据清洗_第16张图片

#使用dropna()删除nan值
data1=data#后面使用数据来填充缺失值
# #inplace=True表示我们不将其赋值给新变量,自动分配填充缺失值
data1['Type 2'].dropna(inplace=True)
data1=data1.dropna().head(6)
print(data1['Type 2'].head(6))

运行结果
Python之数据清洗_第17张图片

2.assert的用法

# assert语法的用法
assert 2==2
# 语句为真,没有返回值

运行结果
Python之数据清洗_第18张图片

assert 1==2
#错误,会返回asserterror错误

运行结果
Python之数据清洗_第19张图片

# 使用notnull()函数判断数据是否缺失,返回boll型数据,这里返回的是Ture
# 使用all()函数判断notnull()返回的值是否都为True,是则返回Ture
# 使用assert断言,语句为真
assert  data1['Type 2'].notnull().all() # 因为已经删除了nan值,所以什么也不返回
# 使用fillna()可以填充缺失值
print(data['Type 2'].head(6))
data["Type 2"].fillna('empty',inplace=True)
print(data['Type 2'].head(6))

运行结果
Python之数据清洗_第20张图片
自学自用,希望可以和大家积极沟通交流,小伙伴们加油鸭,如有错误还请指正,不喜勿喷

你可能感兴趣的:(Python,数据分析,数据分析,python,数据挖掘)