news 2026/2/17 2:43:08

动手学数据分析:实战系列(第三天)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
动手学数据分析:实战系列(第三天)

复习:在前面我们已经学习了Pandas基础,知道利用Pandas读取csv数据的增删查改,今天我们要学习的就是探索性数据分析,主要介绍如何利用Pandas进行排序、算术计算以及计算描述函数describe()的使用。

本文引用数据信息,及文章内容来源请先阅读动手学数据分析一

1 第一章:探索性数据分析

  • 1.6 了解你的数据吗?整体思路
    在这一部分,你会从几个小任务出发,体会「探索性数据分析(EDA)」的核心思路:
    通过排序、算术运算和描述性统计,逐步提出问题、验证直觉、发现数据中的模式。
  • 1.6.1 任务一:用 DataFrame 练习排序(升序)
    在这一部分,你会用np.arange()pd.DataFrame()手动构造一个小数据表,学习:
    • 如何设置行索引和列索引;
    • 如何使用sort_values()sort_index()按不同维度进行排序;
    • 理解按「数据内容」排序 vs 按「行/列标签」排序的区别。
  • 1.6.2 任务二:按票价和年龄对泰坦尼克号乘客排序(降序)
    在这一部分,你会对真实的泰坦尼克号数据用sort_values(by=['票价', '年龄'], ascending=False)做多列排序,并尝试:
    • 观察票价高的乘客在生存上的差异;
    • 练习从排序结果中总结出「业务含义」而不只是看代码输出。
  • 1.6.3 任务三:DataFrame 之间的算术计算与对齐
    在这一部分,你会创建两个有重叠/不完全相同行列标签的 DataFrame,并用frame1_a + frame1_b等操作,理解:
    • Pandas 算术运算如何按「行列标签」自动对齐;
    • 没有对齐上的位置为什么会变成NaN
    • 算术运算不仅是“加减乘除”,更是「自动对齐 + 缺失值处理」的一部分。
  • 1.6.4 任务四:计算泰坦尼克号上“最大家族人数”
    在这一部分,你会通过text['兄弟姐妹个数'] + text['父母子女个数']来构造“家族规模”这一新特征,并用max()找出船上最大家族的人数,体验:
    • 如何通过列之间的运算构造新特征;
    • 如何用一个简单指标(家族人数)帮助理解数据中的人物关系。
  • 1.6.5 任务五:用describe()获取数据的基本统计信息
    在这一部分,你会对一个带缺失值的小型 DataFrame 使用describe(),并理解:
    • count, mean, std, min, 25%, 50%, 75%, max各统计量的含义;
    • 为什么describe()默认只统计数值型列;
    • 如何通过.T转置让结果更方便阅读。
  • 1.6.6 任务六:分析票价和“父母子女个数”的统计特征
    在这一部分,你会对真实的泰坦尼克号数据使用:
    • text['票价'].describe()分析票价分布和波动情况;
    • text['父母子女个数'].describe()(text['父母子女个数'] != 0).sum()观察有家属同行的乘客数量;
    • info()value_counts()nunique()等函数,快速摸清数据的列类型、缺失情况、类别分布和唯一值数量。
  • 本章小结:从函数到“分析思维”
    在这一部分,你会意识到:
    • 探索性分析不仅是熟悉 API,更重要的是学会从结果中提出问题;
    • 为后续的数据清洗和建模打下「理解数据」的基础
开始之前,导入numpy、pandas包和数据
# 加载所需的库importnumpyasnpimportpandasaspd
# 载入之前保存的train_chinese.csv数据,关于泰坦尼克号的任务,我们就使用这个数据text=pd.read_csv('train_chinese.csv')text.head()

1.6 了解你的数据吗?

教材《Python for Data Analysis》第五章

1.6.1 任务一:利用Pandas对示例数据进行排序,要求升序
# 具体请看《利用Python进行数据分析》第五章 排序和排名 部分#自己构建一个都为数字的DataFrame数据frame=pd.DataFrame(np.arange(8).reshape((2,4)),index=['2','1'],columns=['d','a','b','c'])frame

【代码解析】

pd.DataFrame() :创建一个DataFrame对象

np.arange(8).reshape((2, 4)) :

  • 生成一个 2 行 4 列的二维数组,第 1 行是 0,1,2,3,第 2 行是 4,5,6,7。
  • 并重塑为2行4列的二维数组,作为DataFrame的数据内容。

index=[‘2’, ‘1’] :DataFrame 对象的行索引

columns=[‘d’, ‘a’, ‘b’, ‘c’] :DataFrame 对象的列索引

# 大多数时候我们都是想根据列的值来排序,所以,将你构建的DataFrame中的数据根据某一列,升序排列frame.sort_values(by='c',ascending=True)

可以看到sort_values这个函数中by参数指向要排列的列,ascending参数指向排序的方式(升序还是降序)

ascending=True:指定排序方式为升序(从小到大)。

注意:原始的 frame 不会被修改,除非加上 inplace=True 参数。

【总结】下面将不同的排序方式做一个小总结

# 让行索引升序排序frame.sort_index()
# 让列索引降序排序frame.sort_index(axis=1,ascending=False)
# 让任选两列数据同时降序排序frame.sort_values(by=['a','c'],ascending=False)

下面对这几种排序方式进行对比分析:

frame.sort_values(by='c',ascending=True)# 按列 'c' 的值升序排序frame.sort_index()# 按行索引升序排序frame.sort_index(axis=1)# 按列索引升序排序frame.sort_index(axis=1,ascending=False)# 按列索引降序排序frame.sort_values(by=['a','c'],ascending=False)# 先按 'a',再按 'c',都降序排序

1.frame.sort_values(by='c', ascending=True)
  • 排序对象:数据内容(某一列的值)
  • 排序依据:先比较'c'列的值,值小的排前面
  • 常用场景:想按某一列的实际数据大小排序
2.frame.sort_index()
  • 排序对象:行索引(index)
  • 排序依据:行标签(如 ‘1’, ‘2’, …)的字母或数字顺序
  • 常用场景:想让行的顺序变得有序(如从小到大)
3.frame.sort_index(axis=1)
  • 排序对象:列索引(columns)
  • 排序依据:列标签(如 ‘a’, ‘b’, …)的字母或数字顺序
  • 常用场景:让列的顺序变得有序(如从 a 到 z)
4.frame.sort_index(axis=1, ascending=False)
  • 排序对象:列索引(columns)
  • 排序依据:列标签的逆序(如 z 到 a)
  • 常用场景:想让列从大到小排列
5.frame.sort_values(by=['a', 'c'], ascending=False)
  • 排序对象:数据内容(多列的值)
  • 排序依据:先按'a'列降序排,如果'a'相同再按'c'列降序排
  • 常用场景:需要多重排序(比如先按成绩,再按年龄)

总结
  • sort_index按标签(行或列名)排序,适合整理表头顺序。
  • sort_values按数据内容排序,适合分析和查找极值、排名等。
  • by=['a', 'c']支持多列排序,优先级从左到右。
  • axis=1控制是对行还是对列排序(0为行,1为列)。
  • ascending控制升序还是降序。

实际应用时,按内容排序更常用于数据分析,按索引排序更常用于数据展示和整理。

1.6.2 任务二:对泰坦尼克号数据(trian.csv)按票价和年龄两列进行综合排序(降序排列),从数据中你能发现什么
''' 在开始我们已经导入了train_chinese.csv数据,而且前面我们也学习了导入数据过程,根据上面学习,我们直接对目标列进行排序即可 head(20) : 读取前20条数据 '''text.sort_values(by=['票价','年龄'],ascending=False).head(20)

【思考】排序后,如果我们仅仅关注年龄和票价两列。根据常识我知道发现票价越高的应该客舱越好,所以我们会明显看出,票价前20的乘客中存活的有14人,这是相当高的一个比例,那么我们后面是不是可以进一步分析一下票价和存活之间的关系,年龄和存活之间的关系呢?当你开始发现数据之间的关系了,数据分析就开始了。

当然,这只是我的想法,你还可以有更多想法,欢迎写在你的学习笔记中。

1.6.3 任务三:利用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'])frame1_a
frame1_b
#将frame_a和frame_b进行相加frame1_a+frame1_b

【提醒】两个DataFrame相加后,会返回一个新的DataFrame,对应的行和列的值会相加,没有对应的会变成空值NaN。当然,DataFrame还有很多算术运算,如减法,除法等,有兴趣的同学可以看《利用Python进行数据分析》第五章 算术运算与数据对齐 部分,多在网络上查找相关学习资料。

1.6.4 任务四:通过泰坦尼克号数据如何计算出在船上最大的家族有多少人?
''' 还是用之前导入的chinese_train.csv如果我们想看看在船上,最大的家族有多少人(‘兄弟姐妹个数’+‘父母子女个数’),我们该怎么做呢? '''max(text['兄弟姐妹个数']+text['父母子女个数'])

是的,如上,很简单,我们只需找出兄弟姐妹个数和父母子女个数之和最大的数就行,先让这两列相加返回一个Series,然后用max函数求出最大值,当然你还可以想出很多方法和思考角度,欢迎你来说出你的看法。

1.6.5 任务五:学会使用Pandas describe()函数查看数据基本统计信息
#(1) 关键知识点示例做一遍(简单数据)# 具体请看《利用Python进行数据分析》第五章 汇总和计算描述统计 部分#建立一个例子frame2=pd.DataFrame([[1.4,np.nan],[7.1,-4.5],[np.nan,np.nan],[0.75,-1.3]],index=['a','b','c','d'],columns=['one','two'])frame2
# 调用 describe 函数,观察frame2的数据基本信息frame2.describe()''' count : 该列中非空(非 NaN)数据的数量。 mean : 样本数据的平均值 std : 样本数据的标准差 min : 样本数据的最小值 25% : 样本数据25%的时候的值 50% : 样本数据50%的时候的值 75% : 样本数据75%的时候的值 max : 样本数据的最大值 '''# frame2.describe().T# .T 是 DataFrame 的转置(transpose)操作,会把行和列互换。
1.6.6 任务六:分别看看泰坦尼克号数据集中 票价、父母子女 这列数据的基本统计数据,你能发现什么?
''' 看看泰坦尼克号数据集中 票价 这列数据的基本统计数据 '''text['票价'].describe()

【思考】从上面数据我们可以看出,
一共有891个票价数据,
平均值约为:32.20,
标准差约为49.69,说明票价波动特别大,
25%的人的票价是低于7.91的,50%的人的票价低于14.45,75%的人的票价低于31.00,
票价最大值约为512.33,最小值为0。
当然,这只是我的想法,你还可以有更多想法,欢迎写在你的学习笔记中。

''' 通过上面的例子,我们再看看泰坦尼克号数据集中 父母子女个数 这列数据的基本统计数据,然后可以说出你的想法 '''text['父母子女个数'].describe()
(text['父母子女个数']!=0).sum()

查看数据基本信息
info():非常强大,可以一次性看到:
每一列的名称
非空值的数量(可以间接看出缺失值)
数据类型(int, float, object 等)
内存占用

text['父母子女个数'].info()

统计唯一值value_counts():统计某一列中每个值出现的次数(非常适合分类数据,比如性别、登船港口)

text['父母子女个数'].value_counts()

nunique():统计每一列有多少个不同的值。

text.nunique()

【思考】有更多想法,欢迎写在你的学习笔记中。

【总结】本节中我们通过Pandas的一些内置函数对数据进行了初步统计查看,这个过程最重要的不是大家得掌握这些函数,而是看懂从这些函数出来的数据,构建自己的数据分析思维,这也是第一章最重要的点,希望大家学完第一章能对数据有个基本认识,了解自己在做什么,为什么这么做,后面的章节我们将开始对数据进行清洗,进一步分析。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/14 22:29:33

计算机小程序毕设实战-基于SpringBoot的交通违法有奖曝光平台设计与基于springboot+微信小程序的的交通违法有奖曝光平台【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/2/16 22:32:46

HTML行内块标签——img、表单、音视频标签

目录 概念:特殊的标签,有自己独有的功能 img标签: 表单: 1、input表单项 2、下拉框表单项:select 3、内容框:textarea 4、按钮 button 5、去除表单默认样式 ​编辑 音视频标签 概念:特殊的标签&a…

作者头像 李华
网站建设 2026/2/16 1:21:31

微信ipad协议,wechatapi,个人号二次开发

微信生态安全挑战与防护策略微信作为拥有13亿月活用户的平台,其安全体系具有高度复杂性。未经优化的自动化工具面临极高封号风险:第一周35%、一个月65%、三个月85%、六个月95%。微信风控系统技术原理设备层防护 微信采集50设备特征参数,包括硬…

作者头像 李华
网站建设 2026/2/14 22:29:27

MyBatis/MyBatis-Plus类型转换器深度解析:从基础原理到自定义实践

目录前言基本概念一、TypeHandlerTypeHandler作用内置 TypeHandler 的自动映射二、jdbcType 的必要性:处理 NULL 值的核心三、自定义 TypeHandler前言 这篇博客主要讲一下mybatis/mybatisplus框架的类型转换器的相关知识和用法,最近项目有一个技术场景&…

作者头像 李华
网站建设 2026/2/14 22:29:25

sql server自动备份

1.在管理中点击维护计划向导 2.填写任务名称,点击更改 3.选择需要的备份时间,点击确定 4.勾选备份完整数据库 5.点击下一步 6.选择指定数据库 7.选择备份路径 8.选择完成后点击下一步 9.选择清除任务 10.点击下一步 11.点击完成 12.点击执行任务测试是否…

作者头像 李华
网站建设 2026/2/16 5:51:20

vue和springboot框架开发的救援物资管理系统_55j08br6

文章目录具体实现截图主要技术与实现手段关于我本系统开发思路java类核心代码部分展示结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!具体实现截图 同行可拿货,招校园代理 vuespringboot_55j08br6 框架开发的救援物资管理系统…

作者头像 李华