DataWhale课程地址:datawhalechina/hands-on-data-analysis: 动手学数据分析以项目为主线,知识点孕育其中,通过边学、边做、边引导来得到更好的学习效果 (github.com)
写在前面:DataWhale使用jupyter形式,笔者使用Pycharm使用的代码形式。
数据集下载地址:Titanic - Machine Learning from Disaster | Kaggle
1.数据加载
1.1数据载入及初步观察
任务一:导入numpy和pandas
#导入numpy和pandas import numpy as np import pandas as pd
安装numpy和pandas: pip install numpy pandas
任务二:载入数据
#载入数据
df = pd.read_csv('train.csv')#已将文件放在工程目录下
#df = pd.read_csv('../train.csv')#绝对路径格式
print(df.head(3))#输出数据的前三行以判断数据是否成功导入
思考:read_csv与read_table 的区别
read_csv和read_table都是是加载带分隔符的数据,每一个分隔符作为一个数据的标志,但二者读出来的数据格式还是不一样的:read_table是以制表符 t 作为数据的标志,也就是以行为单位进行存储,每一行字符串为一列而不是每一个字符串;read_csv每一个字符串为一列。
如果想让他们效果一样,需要怎么做?
# 调用read_table函数读取文件 data = pd.read_table("../data.txt,sep=','")
# 调用read_csv函数读取文件 df = pd.read_csv("../data.txt")
思考:TSV文件与CSV文件的区别与读取/生成
- TSV与CSV的区别: 1)从名称上即可知道,TSV是用制表符(Tab,'t')作为字段值的分隔符;CSV是用半角逗号(',')作为字段值的分隔符; 2)IANA规定的标准TSV格式,字段值之中是不允许出现制表符的。
- Python对TSV文件的支持: Python的csv模块准确的讲应该叫做dsv模块,因为它实际上是支持范式的分隔符分隔值文件(DSV,delimiter-separated values)的。 delimiter参数值默认为半角逗号,即默认将被处理文件视为CSV。 当delimiter='t'时,被处理文件就是TSV。
- 参考链接
任务三:每1000行为一个数据模块,逐块读取
#每1000行为一个数据模块,逐块读取
data = pd.read_csv('train.csv', chunksize=1000)
#print(data)
#直接输出data时会出现
for chunk in data:#可以通过逐 block 加载
print(chunk.astype(str))
对于
的解决参考此链接:通过逐 block 加载
【思考】什么是逐块读取?为什么要逐块读取呢?chunker(数据块)是什么类型?用for循环打印出来出处具体的样子是什么?
每次读取文件的最多chunksize行,每次读取到的部分以DataFrame类型返回。
逐块读取可以用来读取大文件,防止将文件一次性读入,因为内存占用过多产生各种问题。
链接:DataFrame类型解析
任务四:将表头改成中文,索引改为乘客ID [对于某些英文资料,我们可以通过翻译来更直观的熟悉我们的数据]
#将表头改成中文,索引改为乘客ID
#法1
df = pd.read_csv('train.csv', names=['乘客ID','是否幸存','仓位等级','姓名','性别','年龄','兄弟姐妹个数','父母子女个数','船票信息','票价','客舱','登船港口'],index_col='乘客ID',header=0)
# pd.set_option('display.max_columns', None) #显示完整的列
# pd.set_option('display.max_rows', None) #显示完整的行
print(df.head())#默认为5行
#法2
newNamesDict={
'PassengerId':'乘客ID',
'Survived':'是否幸存',
'Pclass':'乘客等级(1/2/3等舱位)',
'Name':'乘客姓名',
'Sex':'性别',
'Age':'年龄',
'SibSp':'堂兄弟/妹个数',
'Parch':'父母与小孩个数',
'Ticket':'船票信息',
'Fare':'票价',
'Cabin':'客舱',
'Embarked':'登船港口',
}
df=pd.read_csv('train.csv')
df=df.rename(columns=newNamesDict)
df=df.set_index(keys='乘客ID')#需要设置为索引的列名,可以是单个列名,或者是多个列名
print(df.head())
pd.read_csv()参数详解
set_index详解
pandas读取csv格式数据时header参数设置
任务五:查看数据的基本信息,观察表格前10行的数据和后15行的数据
#查看数据的基本信息
print(df.info())
#观察表格前10行的数据和后15行的数据
pd.set_option('display.max_columns', None) #显示完整的列
pd.set_option('display.max_rows', None) #显示完整的行
print(df.head(10),'n',df.tail(15))
任务六:判断数据是否为空,为空的地方返回True,其余地方返回False
#判断数据是否为空,为空的地方返回True,其余地方返回False
pd.set_option('display.max_columns', None) #显示完整的列
pd.set_option('display.max_rows', None) #显示完整的行
print(df.isnull().head())
pd.options.display.max_rows=15#最多显示15行
print(df.isnull().sum())
pandas中显示行、列个数的设置
任务七:将加载并做出改变的数据,在工作目录下保存为一个新文件train_chinese.csv
#将加载并做出改变的数据,在工作目录下保存为一个新文件train_chinese.csv
#注:不同的操作系统保存下来可能会有乱码,可以加入 encoding='GBK' 或 encoding = 'utf-8'
try:
df.to_csv('train_chinese.csv',encoding = 'utf-8')
print('保存成功')
except:
print('保存失败')
1.2Pandas基础
任务一:pandas中有两个数据类型DateFrame和Series,通过查找简单了解他们。
Series:一种类似于一维数组的对象,是由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。仅由一组数据也可产生简单的Series对象。注意:Series中的索引值是可以重复的。
DataFrame:一个表格型的数据结构,包含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等),DataFrame即有行索引也有列索引,可以被看做是由Series组成的字典。参考
#任务一:pandas中有两个数据类型DateFrame和Series,通过查找简单了解他们。
import numpy as np
import pandas as pd
sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
example_1 = pd.Series(sdata)
print(example_1)
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002, 2003],'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
example_2 = pd.DataFrame(data)
print(example_2)
任务二:载入"train.csv"文件并进行一些操作
import numpy as np
import pandas as pd
#任务二:根据上节课的方法载入"train.csv"文件
df = pd.read_csv('train.csv')
#任务三:查看DataFrame数据的每列的名称
print(df.columns)
#任务四:查看"Cabin"这列的所有值
print(df['Cabin'])
print(df.Cabin)
#任务五:加载文件"test_1.csv",然后对比"train.csv",看看有哪些多出的列,然后将多出的列删除
df1=pd.read_csv('test_1.csv')
print(df1.head(3))#输出观察
del df1['a']# 删除多出的'a'列
print(df1.head(3))#输出删除'a'列后的列表
#任务六: 将['PassengerId','Name','Age','Ticket']这几个列元素隐藏,只观察其他几个列元素
# df1.drop(['PassengerId','Name','Age','Ticket'],axis=1).head(3)
# print(df1)#只是隐藏,并未删除,因此此次输出的仍是隐藏前的完整列表
print(df1.drop(['PassengerId','Name','Age','Ticket'],axis=1).head(3))#此次输出隐藏操作后的列表
总结
在 Pandas DataFrame 中
1.添加一行
.loc [index] 将字典作为行添加 Dataframe .append 方法 2. 添加一列
df[column] = value df.insert pd.concat 3.删除行、列
删除行 data.drop([0,1#行索引],inplace = True)
data.drop(index = [3,4,5#行索引],inplace = True)
删除列 data.drop('列名',axis = 1,inplace = True)
data.drop(columns = [‘列名1','列名2'],inplace = True)
参数含义:
labels:要删除的行或列,用列表给出
axis:默认为0,指要删除的是行,删除列时需指定axis为1
index :直接指定要删除的行,删除多行可以使用列表作为参数
columns:直接指定要删除的列,删除多列可以使用列表作为参数
inplace: 默认为False,该删除操作不改变原数据;inplace = True时,改变原数据
任务三:筛选的逻辑
利用pandas进行条件筛选和组合筛选
loc方法
pandas索引函数loc和iloc的区别
import numpy as np
import pandas as pd
df = pd.read_csv('train.csv')
#任务一: 我们以"Age"为筛选条件,显示年龄在10岁以下的乘客信息
print(df[df["Age"]<10].head(3))
# 任务二: 以"Age"为条件,将年龄在10岁以上和50岁以下的乘客信息显示出来,并将这个数据命名为midage
midage = df[(df["Age"]>10)& (df["Age"]<50)]
print(midage.head(3))
# 任务三:将midage的数据中第100行的"Pclass"和"Sex"的数据显示出来
midage = midage.reset_index(drop=True)
print(midage.loc[[100],['Pclass','Sex']])
#任务四:使用loc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来
print(midage.loc[[100,105,108],['Pclass','Name','Sex']])
#任务五:使用iloc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来
midage.iloc[[100,105,108],[2,3,4]]
1.3探索性数据分析
任务一:利用Pandas对示例数据进行排序,要求升序
frame = pd.DataFrame(np.arange(8).reshape((2, 4)),
index=['2', '1'],
columns=['d', 'a', 'b', 'c'])#自己构建一个都为数字的DataFrame数据
print(frame)
print(frame.sort_values(by='c', ascending=True))
#根据'c'列的值来升序排列(by参数指向要排列的列,ascending参数指向排序的方式(升序还是降序))
【代码解析】
pd.DataFrame() :创建一个DataFrame对象
np.arange(8).reshape((2, 4)) : 生成一个二维数组(2*4),第一列:0,1,2,3 第二列:4,5,6,7
index=['2, 1] :DataFrame 对象的索引列
columns=['d', 'a', 'b', 'c'] :DataFrame 对象的索引行
排序方式小总结
让行索引升
序排序
让列索引升
序排序
让列索引降
序排序
让任选两列数据同时降序排序 frame.sort_index() frame.sort_index(axis=1) frame.sort_index
(axis=1, ascending=False)
frame.sort_values(by=['a', 'c'], ascending=False)
任务二:对泰坦尼克号数据(trian.csv)按票价和年龄两列进行综合排序(降序排列)
import numpy as np
import pandas as pd
text = pd.read_csv('train_chinese.csv')#导入之前保存的数据
text1=text.sort_values(by=['票价', '年龄'], ascending=False)
pd.set_option('display.max_columns', None) #显示完整的列
pd.set_option('display.max_rows', None) #显示完整的行
print(text1.head(20))#查看前二十行数据
根据输出数据思考年龄及票价与存活与否的关系。
任务三:利用Pandas进行算术计算,计算两个DataFrame数据相加结果
# 具体请看《利用Python进行数据分析》第五章 算术运算与数据对齐 部分
#建立一个例子
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'])
print(frame1_a)
print(frame1_b)
print(frame1_a + frame1_b)
#两个DataFrame相加后,会返回一个新的DataFrame,对应的行和列的值会相加,没有对应的会变成空值NaN。
任务四:通过泰坦尼克号数据如何计算出在船上最大的家族有多少人
#最大的家族有多少人(‘兄弟姐妹个数’+‘父母子女个数’)
import numpy as np
import pandas as pd
text = pd.read_csv('train_chinese.csv')#导入之前保存的数据
print(text['兄弟姐妹个数'] + text['父母子女个数'])
print(max(text['兄弟姐妹个数'] + text['父母子女个数']))
#两列相加返回一个DataFrame,然后用max函数求出最大值
任务五:使用Pandas describe()函数查看数据基本统计信息
调用describe()函数会自动计算如下数值:
count : 样本数据大小
mean : 样本数据的平均值
std : 样本数据的标准差
min : 样本数据的最小值
25% : 样本数据25%的时候的值
50% : 样本数据50%的时候的值
75% : 样本数据75%的时候的值
max : 样本数据的最大值
对泰坦尼克的部分项目进行分析
print('票价的统计信息:n',text['票价'].describe())
print('父母子女个数的统计信息:n',text['父母子女个数'].describe())
票价分析: 一共有891个票价数据, 平均值约为:32.20, 标准差约为49.69,说明票价波动特别大, 25%的人的票价是低于7.91的,50%的人的票价低于14.45,75%的人的票价低于31.00, 票价最大值约为512.33,最小值为0。
父母子女个数分析:一共有891个数据, 平均值约为:0.38, 标准差约为49.69,75%甚至更多的人没有父母子女,父母子女最多的是6,最少为0。



