提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
Task01:数据加载及探索性数据分析
本篇用于个人学习打卡,故更主要的是记录一些自认为重要的常用知识内容,而非通篇记录|for Mac
提示:以下是本篇文章正文内容,下面案例可供参考
1.1 Pandas数据载入中不同函数的功能互通
以pd.read_csv()
与pd.read_table()
之间的互通为例
其基本描述如下:
Function | Description |
---|---|
pd.read_csv() | 可加载文件、URL或类文件对象;默认comma(逗号)为分隔符(delimiter) ;对应csv(Comma-Separated Values) 文件 |
pd.read_table() | 可加载文件、URL或类文件对象;默认tab('\t')为分隔符(delimiter) ;对应tsv(Tab-Separated Values) 文件 |
由上表易知,两者的区别在于默认的分隔符delimiter
不同,因此想要实现数据载入功能的互通,关键就在于分隔符参数的设定
故有
import pandas as pd
df = pd.read_csv('train.csv')
df.head(5) #展示前5条数据 对应序列 0,1,2,3,4
df = pd.read_table('train.csv',sep = ',')
df.head(5)
其他pandas
数据载入函数描述如下【Source: Python for data analysis 2nd】
1.2 逐块读取
逐块读取是当分析所使用的数据量相当大时,为了避免整体读取造成内存运行速度降低同时占用过多内存空间而进行的操作;
<本次学习活动中的范例所利用的数据本身并不大,可能感受还不明显>
逐块读取需要利用到chunksize
参数,如此在读取时便可返回TextParser
对象,使得我们可以对其进行迭代 iterate
操作
train_chunker = pd.read_csv('train.csv',chunksize = 100)
#学习资料中提示为每1000条分块,但实际train.csv中只有不到900条,因此用chunksize=100更符合实际
train_chunker
for row in train_chunker:
print(row)
1.3 根据需求修改表头
将表头改成中文,索引改为乘客ID
方法1 直接通过names参数进行修改
names = ['乘客ID','是否幸存','乘客等级(1/2/3等舱位)','乘客姓名','性别','年龄','堂兄弟/妹个数','父母与小孩个数','船票信息','票价','客舱','登船港口']
train_rename1 = pd.read_csv('train.csv',names = names)
train_rename1.head()
注意,此处在没有修改其他参数
的情况下,默认将原标头作为新的数据序列作为第一行,同时header = None
,不符合替换标头的需求,因此还需要额外对index_col 与 header
参数进行处理
names = ['乘客ID','是否幸存','乘客等级(1/2/3等舱位)','乘客姓名','性别','年龄','堂兄弟/妹个数','父母与小孩个数','船票信息','票价','客舱','登船港口']
train_rename1 = pd.read_csv('train.csv',names = names,index_col = '乘客ID',header = 0)
train_rename1.head()
将乘客ID
作为行标签,将修改标头后第一行作为列名
Argument | Description |
---|---|
header | 指定作为列名的行序数;默认为 0(第一行) ,没有标头行则为None |
index_col | 指定用作行标签的列名 |
names | 指定输出结果的列名列表,常默认结合 header = None |
方法2 通过DataFrame对象进行修改
names = ['乘客ID','是否幸存','乘客等级(1/2/3等舱位)','乘客姓名','性别','年龄','堂兄弟/妹个数','父母与小孩个数','船票信息','票价','客舱','登船港口']
train_rename2 = pd.read_csv('train.csv')
train_rename2.columns = names
train_rename2.head()
df = train_rename2.set_index('乘客ID') # 重建索引
df.head()
输出结果同上
1.4 查看数据的基本信息
需要了解的数据基本情况包括:数据大小、列数,各列数据格式的,是否包含null等
train_rename1.info() #列数、行数、列名、非空值等
train_rename1.describe() #基本统计量包括count、mean、std、min、max、上下分位数等
train_rename1.dtypes #各列的数据类型
train_rename1.axes #横纵轴信息
train_rename1.columns #列名信息
1.5 判断数据是否为空
pd.isnull(train_rename1)
#或者
train_rename1.isnull()
1.6 输出保存数据
train_rename1.to_csv('train_chinese1.csv')
1.7 查看DataFrame某列的数据
df.columns #查看列名信息
#以 Cabin 列为例
#1.以DataFrame的列名为直接索引
df['Cabin'].head()
df.Cabin.head()
#2.利用pd.loc[]或pd.iloc[]进行索引
df.loc[:10,'Cabin'] #pd.loc[]是根据横纵索引的名字来进行指向
df.iloc[:10,10] #pd.iloc[]是根据横纵索引的序列次数来进行指向
1.8 删除某列
df1 = pd.read_csv('test_1.csv')
df1.columns #查看列名信息
#1.利用pd.drop()函数,注意 指明为纵轴axis=1
df1.drop('Unnamed: 0',axis=1) #不改变原始数据
df1
df1.drop('Unnamed: 0',axis=1,inplace = True) #改变原始数据
df1
#2.利用del命令删除
del df1['Unnamed: 0']
df1.head()
1.9 ***隐藏部分列
上小节认识到pd.drop()在inplace=False
时不改变原数据,故可以用于隐藏部分列
df1.drop(['PassengerId','Name','Age','Ticket'],axis = 1).head()
1.10 ***条件筛选
#筛选出Age小于10的乘客信息
df1[df1['Age']<10].head()
#筛选出Age大于10,小于50的乘客信息 // 注意交集符号为'&',并集符号为'|'
midage = df[(df['Age']>10) & (df['Age']<50)]
midage.head(10)
#此时应注意,midage的默认行序列摘去了不符合条件的数据,而非顺次
在复合条件筛选得到数据片段的基础上进行二次筛选
,需要一些额外的处理,将所得片段重新默认排序
#将midage的数据中第100行的"Pclass"和"Sex"的数据显示出来
midage_reset = midage.reset_index(drop=True)
midage_reset.head(10)
midage_reset.loc[[100],['Pclass','Sex']]
#使用loc方法将midage的数据中第100,105,108行的"Pclass","Name"和"Sex"的数据显示出来
midage_reset.loc[[100,105,108],['Pclass','Name','Sex']]
midage_reset.iloc[[100,105,108],[2,3,4]] #效果同上
补充:两种索引方法loc与iloc的区别
(1) loc是Selection by Label函数,即按标签名取数据
(2) iloc是Selection by Position,即按顺序位置选择数据
1.11 排序方法
# 生成一个简单的DataFrame
df = pd.DataFrame(np.arange(8).reshape((2,4)),index=[2,1],columns=['d', 'a', 'b', 'c'])
df
(1)让行索引升序排序
df.sort_index()
(2)让列索引升序排序
df.sort_index(axis=1)
(3)让行索引降序排序
df.sort_index(axis=1,ascending=False)
(4)任选某列数据升序排序
df.sort_values(by='b')
(5)让任选两列数据同时降序排序
df.sort_values(by=['a','b'],ascending=False)
1.12 计算与新列生成
泰坦尼克号数据如何计算出在船上最大的家族有多少人?
train_chinese = pd.read_csv('train_chinese.csv')
train_chinese.head()
train_chinese['家族人数']=train_chinese['兄弟姐妹个数'] + train_chinese['父母子女个数']
train_chinese.sort_values(by='家族人数',ascending=False)
max(train_chinese['兄弟姐妹个数']+train_chinese['父母子女个数'])
总结
本篇主要对数据载入中的基础知识进行了一定程度的梳理
彩蛋环节
如果希望在JupyterNotebook中的一个cell中一次性输出多个代码块,可先执行:
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"