动手学数据分析第一章学习总结

第一节 数据载入及初步观察

载入数据

任务一:导入pandas和numpy库,没什么好写的,百度20分钟不会的基本告别数据分析了
任务二:载入数据,这个地方经常会有坑,我之前在用pandas的时候也踩过,这里系统写一下:

  • 首先介绍两个简单的概念,相对路径和绝对路径,
    绝对路径:就是你的文件或目录在硬盘上的真正的路径例如“bg.jpg”这个图片是存放在硬盘的“E:\img”目录下,那么 “bg.jpg”这个图片的绝对路径就是“E:\img\bg.jpg"
    相对路径:顾名思义,相对路径就是相对于当前文件的路径。网页中一般表示路径都用这个方法,在使用jupyter notebook时,首页打开的地方就是当前的工作路径,比如我现在打开项目中的文档完成任务时,我当前工作路径就是"D:\hands-on-data-analysis-master"
    要用相对路径读取数据,那数据文件必须在相对路径目录或者其子目录下,这样读取数据就会方便许多,绝对路径加载数据则没有这个限制,任意位置均可。
    比如任务中用相对路径加载数据可以这样写:
train_data=pd.read_csv('train.csv')
train_chinese=pd.read_csv('train_chinese.csv')
test_data=pd.read_csv('test_1.csv')

而用绝对路径需要这样写:

train_data=pd.read_csv(r'D:\hands-on-data-analysis-master\第一单元项目集合\train.csv')
train_chinese=pd.read_csv(r'D:\hands-on-data-analysis-master\第一单元项目集合\train_chinese.csv')
test_data=pd.read_csv(r'D:\hands-on-data-analysis-master\第一单元项目集合\test_1.csv')

这里明显相对路径要简洁许多,但是对于不在当前工作路径下的文件只能用绝对路径。这里绝对路径前加了r因为windows下的目录字符串中通常有斜杠"",而斜杠在Python的字符串中有转义的作用。例如:\n表示换行如果路径中有\new就会被转义。加上r就是为了避免这种情况。

  • pd.read_table()读取分隔符文本文件,也可以读取csv文件,但是默认分隔符是\t也就是空格,读取csv文件时要将分隔符改成’,’
train_data=pd.read_table(r'D:\hands-on-data-analysis-master\第一单元项目集合\train.csv',sep=',')
train_chinese=pd.read_table(r'D:\hands-on-data-analysis-master\第一单元项目集合\train_chinese.csv',sep=',')
test_data=pd.read_table(r'D:\hands-on-data-analysis-master\第一单元项目集合\test_1.csv',sep=',')
  • TSV:tab separated values;即“制表符分隔值”,read_table()默认使用制表符作为分隔符,所以读取该类型文件不需要改分隔符类型
  • CSV: comma separated values;即“逗号分隔值”,逗号作为默认分隔符的文件

任务三:分块读取数据,这是之前没有接触过的,因为之前数据量并不大,用不到分块读取。分块读取主要用于数据量过大的情况,比如有20亿行数据,没办法全部读取到内存里处理,所以分块读取,分块处理,再写入数据文件。
Pandas分块读取的方式很简单,只要在read_csv()里加一个chunksize参数即可,参数表示分块的大小,返回一个可迭代的prasers

chunk=pd.read_csv('train.csv',chunksize=1000)
chunk

<pandas.io.parsers.TextFileReader at 0x26f6c63c488>
可以在for循环中对每一个块进行处理

任务四:对Dataframe的数据项名称和索引进行操作,这些操作可以在读取时完成

train_data=pd.read_csv('train.csv',names=['乘客ID','是否幸存','乘客等级(1/2/3等舱位)','乘客姓名','性别','年龄','堂兄弟/妹个数',' 父母与小孩个数','船票信息','票价','客舱','登船港口'],index_col='乘客ID',header=0)
train_data.head()

read_csv读取时会自动识别表头,数据有表头时不能设置header为空(默认读取第一行,即header=0);数据无表头时,若不设置header,第一行数据会被视为表头,应传入names参数设置表头名称或设置header=None

初步观察和保存数据

这两部分任务不是很多,合在一起写
初步观察

  • 任务一:可以用.info()查看DataFrame的信息,也可用.describe()对数据进行基本的描述性统计,对非数值的数据describe()会返回另外一种汇总统计
  • 任务二:查看前10行和后15行数据只需在head()和tail()函数里传入数字即可
  • 任务三:判断是否为空使用函数isnull(),返回一个DataFrame,空的地方返回True,非空返回False
    保存数据
    可用to_csv()函数,可以用相对路径也可以用绝对路径,这里采用的是相对路径
train_data.to_csv('trainchinese.csv')

第二节 pandas基础

pandas提供两种数据结构,一种是Series,一种是DataFrame.
可以用list数组创建Series,同时规定索引,也可以用字典创建。

a=pd.Series([1,2,3,5],index=['a','b','c','d'])
a

a 1
b 2
c 3
d 5
dtype: int64
Series可以使用和numpy数组相同的方式取值,也可采用字典方式取值,可以将Series看成一个定长的有序字典。

DataFrame使用字典创建是最简单的和常用的创建方式,当然也可以使用list或者numpy数组创建,默认索引从0开始

下面在任务中记录知识点:

  • 1.4任务一创建DataFrame和Series,知识点上面记录过

  • 1.4任务二没什么新知识点,任务三中:利用.columns可以查看DataFrame列名,同样的利用.index也可以查看行索引

  • 1.4任务四:对Dataframe行和列进行切片或索引操作,查看列可以直接使用df[val],可以选取一列或者一组列,同时也可对行进行切片,有时根据条件筛选值时比较方便

  • 1.4任务五任务六,删除某列可以使用del,这样会直接在数据上进行修改,使用drop()函数返回数据修改的副本,不会对数据本身产生影响,也可把参数inplace=True即会产生和del相同的效果

  • 1.5筛选数据涉及对数据进行索引和切片,最常用的方法一个是直接使用[ ]符号,还有就是iloc和loc。iloc[ i , j ] 这里i和j只能为整数值或者布尔表达式,loc[ i , j ] 这里i,j可以是标签名也可是布尔表达式,

  • 这里在任务中涉及一个筛选数据再组合的过程,筛选后的数据索引值用的是在原来数据中的索引值,所以iloc和loc会有不同的结果,reset_index(drop=True)默认是False,会把原来的索引作为数据列保留,不需要则drop=True。

第三节 探索性数据分析

探索性数据分析(EDA)是数据分析的第一步,对数据有一个大概的了解
在任务完成过程中,记录了知识点如下:

  • 对DataFrame或Series进行排序,分为对索引排序和对值进行排序
frame = pd.DataFrame(np.arange(8).reshape((2, 4)), 
                     index=['2', '1'], 
                     columns=['d', 'a', 'b', 'c'])

对索引排序,默认是对行索引排序,要对列索引排序则令axis=1;排序方式默认升序,要降序则将参数ascending设置为False

#对行索引升序 排序
frame.sort_index()
#对列索引降序排序
frame.sort_index(axis=1,ascending=False)

对值排序是按列排序,需要传入by参数,表示按哪一列的值进行排序

#按b,c列的值降序排序
frame.sort_values(by=['a','c'],ascending=False)

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

	a	b	c	e
first	NaN	NaN	NaN	NaN
one	3.0	NaN	7.0	NaN
second	NaN	NaN	NaN	NaN
three	NaN	NaN	NaN	NaN
two	9.0	NaN	13.0	NaN
  • 任务记录

计算泰坦尼克上最大家族人数:

(train['兄弟姐妹个数']+train['父母子女个数']).describe()

count 891.000000
mean 0.904602
std 1.613459
min 0.000000
25% 0.000000
50% 0.000000
75% 1.000000
max 10.000000
dtype: float64
最大值是10,加上自己就是11人,也就是说最大家族人数有11人。

#代码
train.groupby('仓位等级').mean()

乘客ID 是否幸存 年龄 兄弟姐妹个数 父母子女个数 票价
仓位等级
1 461.597222 0.629630 38.233441 0.416667 0.356481 84.154687
2 445.956522 0.472826 29.877630 0.402174 0.380435 20.662183
3 439.154786 0.242363 25.140620 0.615071 0.393075 13.675550
按照仓位等级分组,计算平均值,发现仓位等级越高的平均票价越贵,同时幸存几率要相对大.

'''
看看泰坦尼克号数据集中 票价 这列数据的基本统计数据
'''
train.loc[:,['票价','父母子女个数']].describe()
			票价	   父母子女个数
count	891.000000	891.000000
mean	32.204208	0.381594
std	49.693429	0.806057
min	0.000000	0.000000
25%	7.910400	0.000000
50%	14.454200	0.000000
75%	31.000000	0.000000
max	512.329200	6.000000

可以看出票价标准差非常大,中位数票价在14.5左右,从父母子女个数看出船上的家庭组成,75%位数依然为0,表明大部分人是自己乘坐。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值