小白学 Python 数据剖析(10):Pandas (九)数据运算
大数据生态之数据处理框架探索
人生苦短,我用 Python
前文传送门:
弁言
前面我们引见了许多关于 Pandas 的基本操纵以及拿到一份数据后起首要做的是对数据的基本预处理。
本篇我们接着引见当我们处理完数据后,能够对数据举行的一些盘算操纵。
本篇文章运用的数据为泰坦尼克的数据集,细致的数据集已上传至代码堆栈,有须要的同砚能够自行取用。
数据泉源是有名的 Kaggle : 。
国内的收集接见有些慢,发起自身想办法,着实不行,能够加小编微信,小编有个奇异的软件,迥殊好用。
在正文内容入手下手前,小编先把数据中的表名的中英文对照列出来:
- PassengerId : 搭客ID
- Survived : 是不是幸存
- Pclass : 搭客品级(1/2/3等舱位)
- Name : 姓名
- Sex : 性别
- Age : 岁数
- SibSp : 堂兄弟/妹个数
- Parch : 父母与小孩个数
- Ticket : 船票信息
- Fare : 票价
- Cabin : 客舱
- Embarked : 登船口岸
预处理
起首,我们拿到数据的第一步是先检查一下数据质量,经由过程要领 info()
看下有数据质量:
import pandas as pd
# 数据导入
data_train = pd.read_csv("train.csv")
# 数据检察
print(data_train.info())
# 输出内容
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId 891 non-null int64
Survived 891 non-null int64
Pclass 891 non-null int64
Name 891 non-null object
Sex 891 non-null object
Age 714 non-null float64
SibSp 891 non-null int64
Parch 891 non-null int64
Ticket 891 non-null object
Fare 891 non-null float64
Cabin 204 non-null object
Embarked 889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
None
上面这些数据究竟说了个啥?
看过我前面文章的同砚应当晓得,info()
这个要领常经常使用作检察数据空值,很不辛,这里有些属性的数据不全,如:
- Age(岁数)属性只要714名搭客有纪录
- Cabin(客舱)更是只要204名搭客是已知的
这里我们进一步运用 describe()
看下这批数据的统计剖析数据:
print(data_train.describe())
# 输出内容
PassengerId Survived Pclass Age SibSp
count 891.000000 891.000000 891.000000 714.000000 891.000000
mean 446.000000 0.383838 2.308642 29.699118 0.523008
std 257.353842 0.486592 0.836071 14.526497 1.102743
min 1.000000 0.000000 1.000000 0.420000 0.000000
25% 223.500000 0.000000 2.000000 20.125000 0.000000
50% 446.000000 0.000000 3.000000 28.000000 0.000000
75% 668.500000 1.000000 3.000000 38.000000 1.000000
max 891.000000 1.000000 3.000000 80.000000 8.000000
Parch Fare
count 891.000000 891.000000
mean 0.381594 32.204208
std 0.806057 49.693429
min 0.000000 0.000000
25% 0.000000 7.910400
50% 0.000000 14.454200
75% 0.000000 31.000000
max 6.000000 512.329200
能看出来啥呢?
假如把目光聚焦在 mean
这一行上,能够看到也许 0.383838 的人末了获救了,在 2 / 3 等仓的人要比 1 等仓的多得多(这不是空话),均匀岁数也许是 29.699118 (这个值盘算的时刻会疏忽掉空值)等等。
算数运算
emmmmmmmmmm,写到这里小编发明个问题,用这份数据演示算数运算属实有点不大适宜,满脸为难。
小编这么懒的人都写到这了,肯定是不会换数据集了,列位看官就这么凑合着看吧,先声明一下,以下演示均无现实意义。
这一小节的标题是算数运算,那无非是加减乘除嘛,起首来看下两列相加的示例,这里是把堂兄弟姐妹和父母小孩加在一同,效果轻微有点意义,这个搭客的一切支属:
print(data_train['SibSp'] + data_train['Parch'])
# 输出内容
0 1
1 1
2 0
3 1
4 0
..
886 0
887 0
888 3
889 0
890 0
Length: 891, dtype: int64
两列相减,这里我们运用这个搭客的一切支属再加上他自身减去存活人数,示例以下:
print(data_train['SibSp'] + data_train['Parch'] + 1 - data_train['Survived'])
# 输出内容
0 2
1 1
2 0
3 1
4 1
..
886 1
887 0
888 4
889 0
890 1
Length: 891, dtype: int64
乘除同理,小编这里就不演示,列位同砚能够自身着手尝尝。
比较
这里我们选用存活数和支属数目做比较,几个简朴的示例:
print(data_train['Survived'] > (data_train['SibSp'] + data_train['Parch']))
# 输出内容
0 False
1 False
2 True
3 False
4 False
...
886 False
887 True
888 False
889 True
890 False
Length: 891, dtype: bool
同理,这里除了能够运用 >
还能够运用 >=
、 !=
、 <
和 <=
等运算符。
统计剖析
前面我们运用 describe()
这个要领自动的猎取过当前数据集的一些统计数据,那末我们怎样手动的来猎取它呢?
统计非空值
起首是 count()
统计非空值:
# 按列统计
print(data_train.count())
# 输出内容
PassengerId 891
Survived 891
Pclass 891
Name 891
Sex 891
Age 714
SibSp 891
Parch 891
Ticket 891
Fare 891
Cabin 204
Embarked 889
dtype: int64
# 按行统计
print(data_train.count(axis=1))
# 输出内容
0 11
1 12
2 11
3 12
4 11
..
886 11
887 12
888 10
889 12
890 11
Length: 891, dtype: int64
# 某一列零丁统计
print(data_train['Age'].count())
# 输出内容
714
乞降
接下来是乞降, sum
这个函数想必列位都在 Excel 中用过,那末在 Pandas 中是怎样运用的,请看下面的示例:
# 按列乞降
print(data_train.sum())
# 输出内容
PassengerId 397386
Survived 342
Pclass 2057
Name Braund, Mr. Owen HarrisCumings, Mrs. John Brad...
Sex malefemalefemalefemalemalemalemalemalefemalefe...
Age 21205.2
SibSp 466
Parch 340
Ticket A/5 21171PC 17599STON/O2. 31012821138033734503...
Fare 28693.9
dtype: object
# 按行乞降
print(data_train.sum(axis=1))
# 输出内容
0 34.2500
1 114.2833
2 40.9250
3 95.1000
4 51.0500
...
886 929.0000
887 939.0000
888 918.4500
889 948.0000
890 933.7500
Length: 891, dtype: float64
能够看到,在举行按列乞降的时刻, Pandas 把非数值范例的列直接将一切的字段拼合在了一同,实在无太大意义。
求算数均匀值
接下来是求算数均匀值,这个函数是 mean()
,算数均匀值有一个特点是极易遭到极大极小值的影响,就比方我和小马哥的资产均匀超过了 100 亿,这个实在和我基本上没有半毛钱关联。
print(data_train.mean())
# 输出内容
PassengerId 446.000000
Survived 0.383838
Pclass 2.308642
Age 29.699118
SibSp 0.523008
Parch 0.381594
Fare 32.204208
dtype: float64
mean()
现实是上对每一列举行了求均匀值的运算,现实上能够经由过程 axis
参数按行猎取均匀值,不过在当前的数据集毫无意义,小编这里就不演示了。
求最大最小值
接下来是求最大最小值,在 Excel 实在能够直接经由过程排序来直观的看到某一列的最大最小值,那末,一同看一下在 Pandas 是怎样猎取这两个值:
print(data_train.max())
print('------------------------')
print(data_train.min())
# 输出内容
PassengerId 891
Survived 1
Pclass 3
Name van Melkebeke, Mr. Philemon
Sex male
Age 80
SibSp 8
Parch 6
Ticket WE/P 5735
Fare 512.329
dtype: object
--------------------------------------------
PassengerId 1
Survived 0
Pclass 1
Name Abbing, Mr. Anthony
Sex female
Age 0.42
SibSp 0
Parch 0
Ticket 110152
Fare 0
dtype: object
能够看到,在 Pandas 中猎取最大最小值是运用了两个函数, max()
和 min()
,经由过程字面意义人人也懂,这里一样要提一下是默许是依据列来猎取最大最小值,假如有须要,也能够经由过程参数 axis
来依据行来猎取。
中位数
相比较前面提到过的算数均匀数,中位数是一个异常不错的回响反应一组数据的平常状况的一个数据,不容易遭到极大值和极小值的影响。
在 Pandas 中,猎取中位数是运用 median()
函数:
print(data_train.median())
# 输出内容
PassengerId 446.0000
Survived 0.0000
Pclass 3.0000
Age 28.0000
SibSp 0.0000
Parch 0.0000
Fare 14.4542
dtype: float64
一样, median()
函数也能够经由过程 axis
参数来依据行举行猎取。
众数
众数就是涌现次数最多的那个数,这里我们运用到的函数是 mode()
:
print(data_train.mode())
# 输出内容
Survived Pclass Sex Age SibSp Parch Fare Embarked
0 0 3 male 24.0 0 0 8.05 S
[891 rows x 12 columns]
# 零丁猎取某列众数
print(data_train['Sex'].mode())
# 输出内容
0 male
dtype: object
方差标准差
方差和标准差实在都是用来示意数据的离散水平,标准差是方差的平方根。
在 Pandas 中,盘算方差是运用 var()
函数,而盘算标准差是运用 std()
函数:
print(data_train.var())
# 输出内容
PassengerId 66231.000000
Survived 0.236772
Pclass 0.699015
Age 211.019125
SibSp 1.216043
Parch 0.649728
Fare 2469.436846
dtype: float64
print(data_train.std())
# 输出内容
PassengerId 257.353842
Survived 0.486592
Pclass 0.836071
Age 14.526497
SibSp 1.102743
Parch 0.806057
Fare 49.693429
dtype: float64
列位闲着没事儿的同砚能够核实一下把标准差平方一下看看是不是是方差。
横竖小编怕翻车,是特地核实了一下,确切没有问题,假如哪位同砚核实出来有问题,多是小编这台电脑有问题。
求分位数
分位数是一种比中位数越发细致的依据位置的目标,在统计学中,最经常使用的是四分位数:
- 第一四分位数(Q1),又称「较小四分位数」,即是该样本中一切数值由小到大分列后第 25% 的数字;
- 第二四分位数(Q2),又称「中位数」,即是该样本中一切数值由小到大分列后第 50% 的数字;
- 第三四分位数(Q3),又称「较大四分位数」,即是该样本中一切数值由小到大分列后第 75% 的数字。
在 Pandas 中,猎取分位数是运用 quantile()
函数,但是在运用的过程当中,一定要标识清晰去的分位数值:
print(data_train.quantile(0.25))
print('-----------------------------------------')
print(data_train.quantile(0.5))
# 输出内容
PassengerId 223.5000
Survived 0.0000
Pclass 2.0000
Age 20.1250
SibSp 0.0000
Parch 0.0000
Fare 7.9104
Name: 0.25, dtype: float64
-----------------------------------------
PassengerId 446.0000
Survived 0.0000
Pclass 3.0000
Age 28.0000
SibSp 0.0000
Parch 0.0000
Fare 14.4542
Name: 0.5, dtype: float64
这里的考证能够对照我们前面取出来的中位数,看下是不是一致就好,假如不一致,大概须要换电脑了。
相关性
相关性运算是指两个事件之间的关联水平,这里我们能够运用 corr()
函数来举行相关性运算。
运用体式格局:
DataFrame.corr(method='pearson', min_periods=1)
参数申明:
method:可选值为 {'pearson', 'kendall', 'spearman'}
- pearson:Pearson相关联数来权衡两个数据鸠合是不是在一条线上面,即针对线性数据的相关联数盘算,针对非线性数据便会有偏差。
- kendall:用于反应分类变量相关性的目标,即针对无序序列的相关联数,非正太散布的数据
- spearman:非线性的,非正太剖析的数据的相关联数
我们平常比较经常使用的是皮尔逊相关联数:
print(data_train.corr(method='pearson'))
# 输出内容
PassengerId Survived Pclass Age SibSp Parch
PassengerId 1.000000 -0.005007 -0.035144 0.036847 -0.057527 -0.001652
Survived -0.005007 1.000000 -0.338481 -0.077221 -0.035322 0.081629
Pclass -0.035144 -0.338481 1.000000 -0.369226 0.083081 0.018443
Age 0.036847 -0.077221 -0.369226 1.000000 -0.308247 -0.189119
SibSp -0.057527 -0.035322 0.083081 -0.308247 1.000000 0.414838
Parch -0.001652 0.081629 0.018443 -0.189119 0.414838 1.000000
Fare 0.012658 0.257307 -0.549500 0.096067 0.159651 0.216225
Fare
PassengerId 0.012658
Survived 0.257307
Pclass -0.549500
Age 0.096067
SibSp 0.159651
Parch 0.216225
Fare 1.000000
本篇内容是真的有点长,列位逐步看吧,小编就先溜了~~~
示例代码
老例子,一切的示例代码都邑上传至代码治理堆栈 Github 和 Gitee 上,轻易人人取用。
参考
【阿里云IoT+YF3300】16.云端一体化,天猫精灵操控YF3300