人生苦短,我用 Pythonpython
前文传送门:git
小白学 Python 数据分析(1):数据分析基础github
小白学 Python 数据分析(2):Pandas (一)概述微信
小白学 Python 数据分析(3):Pandas (二)数据结构 Series网络
小白学 Python 数据分析(4):Pandas (三)数据结构 DataFrame数据结构
小白学 Python 数据分析(5):Pandas (四)基础操做(1)查看数据函数
小白学 Python 数据分析(6):Pandas (五)基础操做(2)数据选择spa
小白学 Python 数据分析(7):Pandas (六)数据导入.net
小白学 Python 数据分析(8):Pandas (七)数据预处理code
小白学 Python 数据分析(9):Pandas (八)数据预处理(2)
前面咱们介绍了不少关于 Pandas 的基础操做以及拿到一份数据后首先要作的是对数据的基础预处理。
本篇咱们接着介绍当咱们处理完数据后,能够对数据进行的一些计算操做。
本篇文章使用的数据为泰坦尼克的数据集,具体的数据集已经上传至代码仓库,有须要的同窗能够自行取用。
数据来源是著名的 Kaggle :https://www.kaggle.com/ 。
国内的网络访问有些慢,建议本身想办法,实在不行,能够加小编微信,小编有个神奇的软件,特别好用。
在正文内容开始前,小编先把数据中的表名的中英文对照列出来:
首先,咱们拿到数据的第一步是先检查一下数据质量,经过方法 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()
这个方法常常用做查看数据空值,很不辛,这里有些属性的数据不全,如:
这里咱们进一步使用 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复制代码
同理,这里除了可使用 >
还可使用 >=
、 !=
、 <
和 <=< code=""> 等运算符。
前面咱们使用 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复制代码
各位闲着没事儿的同窗能够核实一下把标准差平方一下看看是否是方差。
反正小编怕翻车,是专门核实了一下,确实没有问题,若是哪位同窗核实出来有问题,多是小编这台电脑有问题。
分位数是一种比中位数更加详细的根据位置的指标,在统计学中,最经常使用的是四分位数:
在 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'}
咱们通常比较经常使用的是皮尔逊相关系数:
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 上,方便你们取用。
https://baike.baidu.com/item/%E5%88%86%E4%BD%8D%E6%95%B0/10064158?fr=aladdin
https://blog.csdn.net/walking_visitor/article/details/85128461