像Excel一样使用Pandas

大家好,我是真诚无套路的肖恩

Pandas功能非常强大,API非常多。这次我们按照Excel的功能来探索Pandas的常用功能。

同时为了更好的理解应用场景,我们从真实的数据出发,来探索数据中的真相。

本次选用的数据是kaggle提供的泰坦尼克号数据,刚好最近国内电影重映,大家一起深入了解一下这场上世纪之初的悲剧。

直接使用腾讯文档表格导入数据如下:

像Excel一样使用Pandas

数据下载和在线链接都在文末的参考链接中

整个数据集大小是: 891行*12列数据。我们还需要了解一下各项数据的含义, 以更好的理解数据。

释义
Survived 是否存活,存活使用1表示
Pclass 船票等级, 船票等级数分1,2,3等座,越小级越高级
Name 乘客姓名
Sex 乘客性别
Age 乘客年龄
SibSp 乘客兄弟姐妹/配偶的个数
Parch 乘客父母/孩子的个数
Ticket 票编号
Fare 乘客所持票的价格
Cabin 乘客所在船舱
Embark 乘客登船港口

使用pandas可以这样导入数据:

# 导入numpy和pandas库
import pandas as pd
import numpy as np

# 载入 titanic_train.csv 数据,并且指定 `PassengerId` 为索引列
df = pd.read_csv('titanic_train.csv', index_col="PassengerId")
df

在pandas中数据大概这样:

像Excel一样使用Pandas

需要说明两点:

  • PassengerId作为索引没有计算到columns(列)中,所以是891行*11列, 比excel少一列
  • 空值自动转换成NaN,而不是excel中的空

接下来我们从execl的下面5个功能开始熟悉pandas

  1. 数据统计
  2. 隐藏列
  3. 排序
  4. 筛选
  5. 分组

数据统计

在excel中可以使用数据统计功能对数据进行简单分析:

像Excel一样使用Pandas

从上图可以知道下面一些汇总信息:

  • 总数计数,比如姓名891个
  • 求和,比如总费用 28693.9493
  • 未填写计数, 比如687个数据未记录船仓Cabin
  • 分类,比如等级分三类,登船港口分三个
  • 平均值,比如年龄均值29.69岁

在pandas中可以使用 info 查看信息:

df.info()

"""
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   PassengerId  891 non-null    int64  
 1   Survived     891 non-null    int64  
 2   Pclass       891 non-null    int64  
 3   Name         891 non-null    object 
 4   Sex          891 non-null    object 
 5   Age          714 non-null    float64
 6   SibSp        891 non-null    int64  
 7   Parch        891 non-null    int64  
 8   Ticket       891 non-null    object 
 9   Fare         891 non-null    float64
 10  Cabin        204 non-null    object 
 11  Embarked     889 non-null    object 
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
"
""

显示数据:

  • 年龄Age和船仓Cabin有缺失数据
  • Name,Sex,Ticket,Cabin和Embarked是文本数据,其它为数字

也可以使用 describe 查看概况:

df.describe()
像Excel一样使用Pandas

相比excel的数据统计,我们还可以得到一些更有用的结论/猜测:

  • 年龄均值29.69, 最小4个月,最大80岁
  • 存活均值0.38,不到四成的存活率( 一个悲伤的故事:( )
  • 最便宜的船票大概是7.9(min=0估计是工作人员,排除在外), 最贵的门票512.32 (看来jack和rose贫富差距很大)
  • 船票均价32约等于四分位数Q3的值31,7成人低于平均,金字塔结构下层穷人比较多(50的标准差也说明这个问题)

隐藏列

excel中可以隐藏一些列,让数据分析时候更聚焦。因为Ticket和Embarked和存活没有关系,我们隐藏这两列:

像Excel一样使用Pandas

在pandas中直接drop这两列就好了:

df = df.drop(columns=['Ticket''Embarked'])
df 
像Excel一样使用Pandas
  • 11列变成9列

排序

使用 船票降序,存活升序 多条件组合排序,可以猜测船票贵的可能存活率较高,其中最尊贵的的两位都存活了;女性存活率可能较高,比如227同等价位的,3位女性全部存活了。

像Excel一样使用Pandas

更改一下船票使用升序,可以验证上面的猜测,满屏就805号幸运儿存活。

像Excel一样使用Pandas

同时也可以发现一个有意思的特例数据,873号乘客是5元船票的1等座,价格和等级也不完全挂钩, 这个很重要。

在pandas中可以这样实现排序:

df.sort_values(by=['Fare','Survived'], ascending=[False, True]).head(20)
像Excel一样使用Pandas

筛选

使用存活和船票等级筛选,并使用年龄降序,查找出可能最年幼的富豪:

像Excel一样使用Pandas

考虑到泰坦尼克号事故是1912年的,这位11个月大的幸存者可能也已经离世。查找新闻找到最后幸存者伊莉莎白·格拉迪斯·迪安(Elizabeth Gladys Dean)的报道(有兴趣的朋友可以看参考链接), 对应测试数据集中的1426号乘客,当时仅九周(不在本训练数据集中)。

在pandas中可以这样实现这个筛选及排序:

df[(df.Survived==1)&(df.Pclass==1)].sort_values(by=['Age'])
像Excel一样使用Pandas

和excel筛选一样,也可以选择任意条件,比如找出有空数据的行:

df[df['Age'].isnull()|df['Cabin'].isnull()].sort_values(by=['Fare'], ascending=False)
像Excel一样使用Pandas

分组

excel中可以使用分组功能,对数据进行一些展示和统计:

像Excel一样使用Pandas

pandas中的分组功能和excel的逻辑有点差异,不能够同时进行汇总或者求均值,可以先统计:

df.groupby(by=["Survived"]).sum()
像Excel一样使用Pandas
  • 存活下来的人总票价要高出一截,也可以猜测富人存活率高一点

再求均值:

df.groupby(by=["Survived"]).mean()
像Excel一样使用Pandas
  • 存活下来的人平均票价要高出一截,也可以猜测富人存活率高一点

我们还可以按照性别分类进行统计:

df.groupby(by=["Sex"]).mean()
像Excel一样使用Pandas
  • 女性的均值大于0.5,可以说明女性的存活率会更高(分布偏向1)

小结

我们通过分析泰坦尼克的数据,像使用Excel一样使用了Pandas,学习了数据统计、筛选、排序等常用功能。

参考链接

  • titanic_train https://www.kaggle.com/datasets/tedllh/titanic-train
  • 腾讯文档titanic_train
  • 泰坦尼克号幸存者故事:最后1位2009年去世 https://tech.sina.cn/d/bk/2012-04-14/detail-iavxeafs2353466.d.html
  • https://pandas.pydata.org/


原文始发于微信公众号(游戏不存在):像Excel一样使用Pandas

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/178689.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!