DataWhale-2023-1 Data Analysis(一)

本文介绍了使用Pandas进行数据加载的方法,如read_csv与read_table的互通,以及逐块读取大数据的技巧。还详细讲解了如何修改表头、查看数据基本信息、处理空值、保存数据、筛选条件、排序和计算新列。内容适用于数据预处理和分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


Task01:数据加载及探索性数据分析

本篇用于个人学习打卡,故更主要的是记录一些自认为重要的常用知识内容,而非通篇记录|for Mac


提示:以下是本篇文章正文内容,下面案例可供参考

1.1 Pandas数据载入中不同函数的功能互通

pd.read_csv()pd.read_table()之间的互通为例
其基本描述如下:

FunctionDescription
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

Parsing functions in pandas - 《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作为行标签,将修改标头后第一行作为列名

在这里插入图片描述

ArgumentDescription
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[]是根据横纵索引的序列次数来进行指向

查看DataFrame某列


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"
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值