前言
首先我们做数据分析,想要得出最科学,最真实的结论,必须要有好的数据。而实际上我们一般面对的的都是复杂,多变的数据,所以必须要有强大的数据处理能力,接下来,我从我们面临的最真实的情况,一步一步教会大家怎么做。
1.数据的读取
1
2
3
4
5
6
7
|
( 1 )读取模块
Import pandas as pd
Import numpy as np
( 2 )读取表格的全部数据
df = pd.read_csv( ".data/HR.csv" )
( 3 )读取你所需要的数据
sl_s = df[ "sactisfaction_level" ]
|
2. 数据的处理
2.1.异常值(空值)处理
2.1.1删除
首先,第一步是对空值的处理。
有两种,一种直接删除,另一种指代。
如果数据多,想简单一点,就直接删除,方法都很简单。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
首先,建立一个DataFrame表
1. 为了确定是否含有空值:
df.isnull() #如果含有空值,返回True
2. 删除
df.dropna() #去掉含空值的行
如果想要删除某一个属性含空值的行就加入subset参数
df.dropna(subset = [ "B" ]) #去掉B属性含空值的行
判断是否有重复的数据:
df.duplicated([ "A" ]) #A属性中重复的数据返回True
删除A属性重复的行
df.drop_duplicates([ "A" ])
df.drop_duplicates([ "A" ],keep = False ) #删除A属性全部重复的行
df.drop_duplicates([ "A" ],keep = first) #删除A属性全部重复的行,保留第一个
df.drop_duplicates([ "A" ],keep = last) #删除A属性全部重复的行,保留最后一个
|
2.1.2指代
有些数据非常重要,不能删除,那我们就选择指代,也就是替换
1
2
3
4
5
6
7
8
9
10
|
#含空值的数据被替换为“b*”
df.fillna( "b*" )
#E属性中的含空值的数据被替换成该属性的平均值
df.fillna(df[ "E" ].mean())
#插值替换
如果含空值的元素为最后一个,那么空值的数据替换成和上一个数据一样
如何含空值的元素为中间,那么空值的数据被(上 + 下) / 2 代替
df[ "E" ].interpolate()
#3次样条插值 order 参数就是几次样条插值
df[ "E" ].interpolate(method = "spline" ,order = 3 )
|
*函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
( 4 )异常值分析(含有就返回 True ) - - isnull()
sl_s.isnull()
主要表示没有空值
( 5 )提取异常值的该属性信息
sl_s[sl_s.isnull()]
( 6 )提取异常值的表格全部信息
df[df[ "sactisfaction_level" ].isnull()]
( 7 )丢弃异常值 - - dropna()
sl_s = sl_s.dropna()
注:删除为空的异常值
可以利用where()把异常数据赋空,然后利用dropna()删除
( 8 )填充异常值 - - fillna()
sl_s = sl_s.fillna()
( 9 )平均值 - - mean()
sl_s.mean()
( 10 )标准差 - - std()
Sl_s.std()
( 11 )最大值 - - max ()
sl_s. max ()
( 12 )最小值 - - min ()
sl_s. min ()
( 13 )中位数 - - median()
sl_s.median()
( 14 )下四分位数 - - quantile(q = 0.25 )
sl_s.quantile(q = 0.25 )
( 15 )上四分位数 - - quantile(q = 0.75 )
sl_s.quantile(q = 0.75 )
( 16 )偏度 - - skew()
sl_s.skew()
分析:小于 0 是负偏 均值偏小,大部分数是比他的均值大的
大于 0 稍微有些振偏
远大于 0 , 是极度振偏,均值要比他的大多数值大好多。
( 17 )峰度 - - kurt()
sl_s.kurt()
分析:< 0 相比于正态分布,他的趋势相对平缓
远大于 0 说明他的形变是非常大的,所以是不靠谱的
( 18 )获得离散化的分布(numpy模块) - - histogram()
np.histogram(sl_s.values,bins = np.arange( 0.0 , 1.1 , 0.1 ))
结果分析:
[ 195 , 1214 , 532 , 974 ,…]
[ 0.0 , 0.1 , 0.2 , 0.3 , 0.4 …]
代表 0.0 - 0.1 之间有 195 个数, 0.1 - 0.2 之间有 1214 个数,以此类推
分布间隔为 0.1
|
3.利用四分位数来去除异常值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
3.1 .提取大于 1 的值
le_s[le_s> 1 ]
3.2 去除大于 1 的异常值
le_s[le_s< = 1 ]
3.3 提取正常值(利用四分位数)
3.3 . 1 下四分位
q_low = le_s.quantile(q = 0.25 )
3.3 . 2 上四分位
q_high = le_s.quantile(q = 0.75 )
3.3 . 3 四分位间距
q_interval = q_high - q_low
3.3 . 4 定义k的值
K = 1.5 ~ 3 之间
如果k = 1.5 ,删除的异常值是中度异常
如果k = 3.0 ,删除的异常值是极度异常
3.3 . 5 筛选
le_s = le_s[le_s<q_high + k * q_interval][le_s>q_low - k * q_interval]
3.4 数据的个数 - - len ()
len (le_s)
3.5 离散分布直方图(numpy模块)
np.histogram(le_s.values,bins = np.arange( 0.0 , 1.1 , 0.1 ))
3.6 回顾数据的平均值,标准差,中位数,最大值,最小值,偏度,峰度,确定数据的正常。
|
4.静态结构分析
1
2
3
4
5
6
|
4.1 每个值出现的次数 - - values_counts()
np_s.value_counts()
4.2 获取该数据的构成和比例(每个值的频率)
np_s.value_counts(normalize = True )
4.3 排序
np_s.value_counts(normalize = True ).sort_index()
|
5.数据分区间
1
2
3
4
5
6
7
|
5.1 把数据分成几份 - - histogram()
np.histogram(amh_s.values,bins = 10 ) 把数据分成 10 份
5.2 另一种方法 加了区间,计算区间的频数
(左闭右开的区间)
Np.histogram(amh_s.values,bins = np.arange(amh_s. min (),amh_s. max () + 10 , 10 ))
(左开右闭的区间)
amh_s.value_counts(bins = np.arange (amh_s. min (),amh_s. max () + 10 , 10 ))
|
6.英文异常值数据的处理
1
2
3
4
5
6
7
8
9
10
|
6.1 首先,统计该数据的分布频数
s_s.value_counts()
6.2 确定异常值的名字。
6.3 把异常值赋空(NaN) - - where()
s_s.where(s_s! = "name" )
意思是把”name”的数据赋空
6.4 把赋空的异常值删除 - - dropna()删除异常值
s_s.where(s_s! = "name" ).dropna()
6.5 检查删除异常值的结果
s_s.where(s_s! = "name" ).dropna().value_counts()
|
7.对比分析
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
7.1 对表格中空值的行删除
Df = df.dropna(axis = 0 ,how = 'any' )
axis = 0 ,代表的是行删除
how = ‘ any ' 代表的是含有部分空值就执行行删除
how = ‘ all ' 代表的是一行全部是空值执行行删除
7.2 含有条件性的对异常值的删除
df = df[df[ "last_evaluation" ]< = 1 ] [df[ "salary" ]! = "name" ][df[ "department" ]! = "sale" ]
7.3 分组(比如:把同一部门的人分为一组) - - groupby()
df.groupby( "department" )
7.4 对分组后的组取均值
df.groupby( "department" ).mean()
7.5 取部分数据(切片) - - loc()
df.loc[:,[ "last_evaluation" , "department" ]] .groupby( "department" )
7.6 取部分数据求平均
df.loc[:,[ "last_evaluation" , "department" ]] .groupby( "department" ).mean()
7.7 取部分数据求极差 - - apply ()
df.loc[:,[ "average_monthly_hours" , "department" ]].groupby ( "department" )[ "average_monthly_hours" ]. apply ( lambda x:x. max () - x. min ())
|
总结
以上所述是小编给大家介绍的python实现数据分析与建模 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
原文链接:http://www.uml.org.cn/bigdata/201907113.asp