当前位置: 首页 > news >正文

【Pandas 数据分析 1】快速入门

本专栏将详细介绍 Python 常用库 Pandas 的用法

目录

1.1 读取数据

1.2 查看数据

1.3 验证数据

1.4 建立索引

1.5 数据选取

1.6 排序

1.7 分组聚合

1.8 数据转换

1.9 增加列

1.10 统计分析

1.11 绘图

1.12 导出


1.1 读取数据

变量名用df(DataFrame的缩写,后续会介绍),它是Pandas二维数据的基础结构

import pandas as pd # 引入Pandas库,按惯例起别名pd

# 以下两种效果一样,如果是网址,它会自动将数据下载到内存
df = pd.read_excel('https://www.gairuo.com/file/data/dataset/team.xlsx')
df = pd.read_excel('team.xlsx') # 文件在notebook文件同一目录下
# 如果是CSV,使用pd.read_csv(),还支持很多类型的数据读取

其中:自动增加了第一列,是Pandas为数据增加的索引,从0开始,程序不知道我们真正的业务索引,往往需要后面重新指定,使它有一定的业务意义;由于数据量大,自动隐藏了中间部分,只显示前后5条;底部显示了行数和列数。

1.2 查看数据

df.head() # 查看前5条,括号里可以写明你想看的条数
df.tail() # 查看尾部5条
df.sample(5) # 随机查看5条

1.3 验证数据

df.shape # (100, 6) 查看行数和列数
df.info() # 查看索引、数据类型和内存信息
df.describe() # 查看数值型列的汇总统计
df.dtypes # 查看各字段类型
df.axes # 显示数据行和列名
df.columns # 列名

df.info()显示有数据类型、索引情况、行列数、各字段数据类型、内存占用等:

df.describe()会计算出各数字字段的总数(count)、平均数(mean)、标准差(std)、最小值(min)、四分位数和最大值(max)

1.4 建立索引

以上数据真正业务意义上的索引是name列,所以我们需要使它成为索引:

df.set_index('name', inplace=True) # 建立索引并生效

其中可选参数inplace=True会将指定好索引的数据再赋值给df使索引生效,否则索引不会生效。注意,这里并没有修改原Excel,从我们读取数据后就已经和它没有关系了,我们处理的是内存中的df变量。

1.5 数据选取

接下来,我们像Excel那样,对数据做一些筛选操作。

(1)选择列:

# 查看指定列
df['Q1']
df.Q1 # 同上,如果列名符合Python变量名要求,可使用

这里返回的是一个Series类型数据,可以理解为数列,它也是带索引的。之前建立的索引在这里发挥出了作用,否则我们的索引是一个数字,无法知道与之对应的是谁的数据。

选择多列的可以用以下方法:

# 选择多列
df[['team', 'Q1']] # 只看这两列,注意括号
df.loc[:, ['team', 'Q1']] # 和上一行效果一样

df.loc[x, y]是一个非常强大的数据选择函数,其中x代表行,y代表列,行和列都支持条件表达式,也支持类似列表那样的切片(如果要用自然索引,需要用df.iloc[])。下面的例子中会进行演示。

(2)选择行:

# 用指定索引选取
df[df.index == 'Liver'] # 指定姓名

# 用自然索引选择,类似列表的切片
df[0:3] # 取前三行
df[0:10:2] # 在前10个中每两个取一个
df.iloc[:10,:] # 前10个

(3)指定行和列

同时给定行和列的显示范围:

df.loc['Ben', 'Q1':'Q4'] # 只看Ben的四个季度成绩
df.loc['Eorge':'Alexander', 'team':'Q4'] # 指定行区间

(4)条件选择

按一定的条件显示数据:

# 单一条件
df[df.Q1 > 90] # Q1列大于90的
df[df.team == 'C'] # team列为'C'的
df[df.index == 'Oscar'] # 指定索引即原数据中的name

# 组合条件
df[(df['Q1'] > 90) & (df['team'] == 'C')] # and关系
df[df['team'] == 'C'].loc[df.Q1>90] # 多重筛选

1.6 排序

df.sort_values(by='Q1') # 按Q1列数据升序排列
df.sort_values(by='Q1', ascending=False) # 降序

df.sort_values(['team', 'Q1'], ascending=[True, False]) # team升序,Q1降序

1.7 分组聚合

可以实现类似SQL的groupby那样的数据透视功能:

df.groupby('team').sum() # 按团队分组对应列相加
df.groupby('team').mean() # 按团队分组对应列求平均
# 不同列不同的计算方法
df.groupby('team').agg({'Q1': sum,  # 总和
                        'Q2': 'count', # 总数
                        'Q3':'mean', # 平均
                        'Q4': max}) # 最大值

1.8 数据转换

对数据表进行转置,不过我们这里仅用sum聚合。

df.groupby('team').sum().T

 也可以试试以下代码,看有什么效果:

df.groupby('team').sum().stack()
df.groupby('team').sum().unstack()

1.9 增加列

用Pandas增加一列非常方便,就与新定义一个字典的键值一样。

df['one'] = 1 # 增加一个固定值的列
df['total'] = df.Q1 + df.Q2 + df.Q3 + df.Q4 # 增加总成绩列
# 将计算得来的结果赋值给新列
df['total'] = df.loc[:,'Q1':'Q4'].apply(lambda x:sum(x), axis=1)
df['total'] = df.sum(axis=1) # 可以把所有为数字的列相加
df['avg'] = df.total/4 # 增加平均成绩列

1.10 统计分析

df.mean() # 返回所有列的均值
df.mean(1) # 返回所有行的均值,下同
df.corr() # 返回列与列之间的相关系数
df.count() # 返回每一列中的非空值的个数
df.max() # 返回每一列的最大值
df.min() # 返回每一列的最小值
df.median() # 返回每一列的中位数
df.std() # 返回每一列的标准差
df.var() # 方差
s.mode() # 众数

1.11 绘图

Pandas利用plot()调用Matplotlib快速绘制出数据可视化图形。注意,第一次使用plot()时可能需要执行两次才能显示图形。如图1-13所示,可以使用plot()快速绘制折线图。

df['Q1'].plot() # Q1成绩的折线分布

可以先选择要展示的数据,再绘图。

df.loc['Ben','Q1':'Q4'].plot() # ben四个季度的成绩变化

可以使用plot.bar绘制柱状图。

df.loc[ 'Ben','Q1':'Q4'].plot.bar() # 柱状图
df.loc[ 'Ben','Q1':'Q4'].plot.barh() # 横向柱状图

对数据聚合计算后,可以绘制成多条折线图:

# 各Team四个季度总成绩趋势
df.groupby('team').sum().T.plot()

也可以用pie绘制饼图:

# 各组人数对比
df.groupby('team').count().Q1.plot.pie()

1.12 导出

df.to_excel('team-done.xlsx') # 导出 Excel文件
df.to_csv('team-done.csv') # 导出 CSV文件

导出的文件位于notebook文件的同一目录下。

————————————————————————————

查看主页内容。

相关文章:

  • Python中计算程序的运行时间——timeit模块
  • 第十三届蓝桥杯JavaB组省赛——最大子矩阵 (AC)
  • 【CMake】第2篇 CMake构建.h与.cpp文件
  • Kmeans
  • 【C++】C++11的那些新特性
  • 【数据结构 | 入门】线性表与链表 (问题引入实现算法优化)
  • vmware虚拟机中的archlinux无法播放声间的解决办法
  • 深度学习常用的backbone有哪些
  • 君正X2000/X1600主控CPU方案有哪些场景?行业迈向人机交互智能时代来啦!
  • c++类和对象万字详解
  • Less预处理——初识Less
  • 在低浓度下修饰生物分子的Pyrimidine-Tetrazine-PEG1-Alkyne 四嗪试剂
  • 【web前端开发】前端生日礼物--主页面篇
  • Linux 驱动开发 五十六:Buildroot 笔记
  • 移动端JDtoolbar
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 【刷算法】求1+2+3+...+n
  • happypack两次报错的问题
  • js操作时间(持续更新)
  • Js基础——数据类型之Null和Undefined
  • leetcode386. Lexicographical Numbers
  • mysql常用命令汇总
  • Python利用正则抓取网页内容保存到本地
  • Rancher-k8s加速安装文档
  • Spring Boot MyBatis配置多种数据库
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • 基于遗传算法的优化问题求解
  • 批量截取pdf文件
  • 网页视频流m3u8/ts视频下载
  • 我与Jetbrains的这些年
  • 系统认识JavaScript正则表达式
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • #define用法
  • #Java第九次作业--输入输出流和文件操作
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (三)mysql_MYSQL(三)
  • (四)JPA - JQPL 实现增删改查
  • (转)ABI是什么
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)项目管理杂谈-我所期望的新人
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • *2 echo、printf、mkdir命令的应用
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .net/c# memcached 获取所有缓存键(keys)
  • .net打印*三角形
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • ::前边啥也没有
  • @SuppressWarnings(unchecked)代码的作用
  • [AMQP Connection 127.0.0.1:5672] An unexpected connection driver error occured
  • [Android] Implementation vs API dependency