该博文用于记录Datewhale-2021.8月组队学习-动手学数据分析 学习过程的要点,通过kaggle网站上泰坦尼克的任务为例实现数据分析全流程,同时熟悉Jupyter Notebook的基本操作
1 第一节:数据载入及初步观察
1.1 载入数据
数据集来源: https://www.kaggle.com/c/titanic/overview
下载得到’ train ’ ’ gender_submission '和 ’ test_1 '三份文件
任务一:导入python库
import numpy as np
import pandas as pd
import os
from matplotlib import pyplot as plt
*注:import numpy和from numpy import 的区别
两种方式都是引入numpy库中的所有函数、函数、对象、变量等,两者的区别在于调用其中内容时不同。
import numpy,则后续使用该库下的属性都需要在前面加上numpy
from numpy import *,则不需要加入。以调用numpy中的random模块为例,第一种方式要用numpy.random,第二种方式只用random即可,一般推荐使用第一种方式
任务二:载入数据
(1) 使用相对路径载入数据
(2) 使用绝对路径载入数据
# 相对路径和绝对路径
df = pd.read_csv('train.csv')
df = pd.read_csv('E:\\jupyter\\workspace\\train.csv')
相对路径载入报错时,尝试使用os.getcwd()查看当前工作目录。
# 查看绝对路径
path = os.path.abspth('train.csv')
【思考】 数据加载 pd.read_csv()和pd.read_table()的不同
read_csv和read_table都是加载带分隔符的数据,每一个分隔符作为一个数据的标志,但二者读出的数据格式不一样,read_table是以制表符\t作为数据的标志,也就是以行为单位进行存储,而read_csv是数据之间以’,'逗号分隔。
tip:可以把默认的分隔符改为逗号从而使两者等价
pd.read_table(path,sep = ',')
任务三:逐块读取数据
每1000行为一个数据模块,逐块读取
df = pd.read_csv('train.csv',chunksize = 1000)
这时我们想要查看表格的前几行,可以看到使用chunksize赋值之后 df的数据类型变成textfilereader之后head方法不再适用,需要用到命令df.get_chunk()
任务四:将表头改成中文,索引改为乘客ID
# 法一
df = pd.read_csv('train.csv')
df.columns = ['乘客ID','是否幸存','乘客等级(1/2/3等舱位)','乘客姓名','性别','年龄','堂兄弟/妹个数','父母与小孩个数','船票信息','票价','客舱','登船港口']
df
# 法二
也可以在读取文件的时候直接重命名
df = pd.read_csv('train.csv',names = ['乘客ID','是否幸存','乘客等级(1/2/3等舱位)','乘客姓名','性别','年龄','堂兄弟/妹个数','父母与小孩个数','船票信息','票价','客舱','登船港口'])
df
法一即将原英文列名替换为中文,而法二是在原英文表头的上方再加上一行中文表头,原英文表头作为第一行数据,可以后续删除该行
数据的初步观察
任务: 查看数据的基本信息
df.info() #查看数据类型结构
df.describe()
DataFrame的基础属性
df.shape ——行数 列数
df.dtypes——列数据类型
df.ndim ——数据维度
df.index——行索引
df.columns——列索引
df.values——对象值,二维ndarray数组
DataFrame整体情况
df.head(10)——显示前10行,默认是5行
df.tail()——显示末尾几行,默认是5
df.info()——相关系数,如行数,列数,列索引、列非空值个数,列类型,内存占用
df.describe()——快速统计结果,计数、均值、标准差、最大值、四分数、最小值
df.isnull()——判断数据是否为空,为空的地方返回True,其余地方返回False
1.3 保存数据
1.3.1 将数据在工作目录下保存为一个新文件
# 注意:不同的操作系统保存下来可能会有乱码,大家可以加入`encoding='GBK' 或者 ’encoding = ’utf-8‘‘`
encoding = 'utf-8'
df.to_csv('train_chinese.csv')
第二节:Pandas基础课程
1.4 Pandas中的两种数据类型
1.4.1 了解Dataframe与Series
Series是带标签的一维数组,可存储整数、浮点数、字符串、python对象登类型的数据,轴标签统称为索引。调用pd.Series即可创建Series s=pd.Series(data, index=index)
>>>s = pd.Series(np.random.randn(5), index=["a", "b", "c", "d", "e"])
>>>s
a 0.560815
b -0.623777
c 0.864192
d 0.045251
e -2.292481
dtype: float64
>>>s1 = pd.Series([1, 2, 3, 4, 5], index=["a", "b", "c", "d", "e"])
>>>s1
a 1
b 2
c 3
d 4
e 5
dtype: int64
# Series可以用字典实例化
>>>s2 = pd.Series({"b": 1, "a": 0, "c": 2})
>>>s2
b 1
a 0
c 2
dtype: int64
Dataframe是由多种类型的列构成的二维标签数据结构,类似于excel、SQL表、或series对象构成的字典
>>>d = { "one": pd.Series([1.0, 2.0, 3.0], index=["a", "b", "c"]),
"two": pd.Series([1.0, 2.0, 3.0, 4.0], index=["a", "b", "c", "d"]),
}
>>>df = pd.DataFrame(d)
df
1.4.2 查看DataFrame数据的每列的名称
>>>df.columns
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
dtype='object')
1.4.3查看"Cabin"这列的所有值
#法一
>>>df.Cabin
#法二
>>>df['Cabin']
0 NaN
1 C85
2 NaN
3 C123
....
888 NaN
889 C148
890 NaN
Name: Cabin, Length: 891, dtype: object
>>>type(df.Cabin)
pandas.core.series.Series
# 使用嵌套将其还原为dataframe
df[['Cabin']]
1.4.4 删除某一列
经过我们的观察发现一个测试集test_1.csv有一列a是多余的,我们需要将这个多余的列删去
#使用del命令
del test_1['a']
test_1.head()
#使用pop命令
test_1.pop('a')
test_1.head()
【思考】还有其他的删除多余的列的方式吗?
test_1 = pd.read_csv('test_1.csv')
test_1.drop(['a'],axis = 1)
这里返回的是一个副本,用inplace参数来删除test_1本身中的列a,默认为副本false
test_1.drop(['a'],axis = 1,inplace = True)
将某几列隐藏
这里的意思是将列元素隐藏,所以只显示其副本即可
test_1.drop(['PassengerId','Name','Age','Ticket'],axis = 1)
对比上述两种 如果想要完全的删除你的数据结构,使用inplace=True,因为使用inplace就将原数据覆盖了
1.5 筛选数据
1.5.1 以"Age"为筛选条件,显示年龄在10岁以下的乘客信息。
test_1[test_1['Age'] < 10]
1.5.2 筛选10岁以上和50岁以下
>>>midage = test_1[(test_1['Age'] > 10) & (test_1['Age'] < 50)]
>>>midage
>>>midage.shape
(576,14)
1.5.3 将midage的数据中第100行的"Pclass"和"Sex"的数据显示出来
midage.to_csv('midage.csv')
midage.loc[[100],['Pclass','Sex','Name']]
#需要注意的是原数据中行数和索引对应的序号数不一样
midage1 = midage.reset_index(drop = True)
midage1.to_csv('midage1.csv')
midage1.loc[[100],['Pclass','Sex','Name']]
>>>midage.index
Int64Index([ 0, 1, 2, 3, 4, 8, 9, 12, 13, 14,
...
880, 881, 882, 883, 884, 885, 886, 887, 889, 890],
dtype='int64', length=576)
>>>midage1.index
RangeIndex(start=0, stop=576, step=1)
【提示】在抽取数据中,我们希望数据的相对顺序保持不变,用什么函数可以达到这个效果呢?
- reset_index 从官方文档中贴图显示其区别
1.5.4 使用loc和iloc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来
loc需要写出具体的列名,而iloc通过第几列来确定
midage1.loc[[100,105,108],['Pclass','Name','Sex']]
midage1.iloc[[100,105,108],[3,4,5]]
第三节 探索性数据分析
1.6.1 利用Pandas对示例数据进行排序,要求升序
sample = pd.DataFrame(np.random.rand(3,3),index=list('213'),
columns=list('bca'))
sample
sample.sort_values('a')
- axis 默认为 0 按行排列;columns 1 按列排列
- ascending 默认true升序排列;false 降序排列
# 按行索引升序排列,变成1 2 3
sample.sort_index()
# 按列索引升序排列,变成a b c
sample.sort_index(axis = 1)
# 按列索引降序排列
sample.sort_index(axis = 1,ascending = False)
# 任选两列同时降序排序
sample.sort_values(['a','c'], ascending = False)
1.6.2 利用Pandas对示例数据进行排序,要求升序
frame1_a = pd.DataFrame(np.arange(9.).reshape(3, 3),
columns=['a', 'b', 'c'],
index=['one', 'two', 'three'])
frame1_b = pd.DataFrame(np.arange(12.).reshape(4, 3),
columns=['a', 'e', 'c'],
index=['first', 'one', 'two', 'second'])
frame1_a + frame1_b
【提醒】两个DataFrame相加后,会返回一个新的DataFrame,对应的行和列的值会相加,没有对应的会变成空值NaN。
1.6.3 通过泰坦尼克号数据如何计算出在船上最大的家族有多少人?
df.head(2)
max(df['堂兄弟/妹个数'] + df['父母与小孩个数'])
1.6.4 学会使用Pandas describe()函数查看数据基本统计信息
df.describe()
>>>df['票价'].describe()
count 891.000000
mean 32.204208
std 49.693429
min 0.000000
25% 7.910400
50% 14.454200
75% 31.000000
max 512.329200
Name: 票价, dtype: float64
>>>from matplotlib import pyplot as plt
>>>plt.hist(df['票价']) #画出直方图
从上面数据我们可以看出, 一共有891个票价数据,整体呈左偏分布
平均值约为:32.20, 标准差约为49.69,说明票价波动特别大, 25%的人的票价是低于7.91的,50%的人的票价低于14.45,75%的人的票价低于31.00, 票价最大值约为512.33,最小值为0
其他描述统计命令