python中的pandas库_数据分析中 pandas 库的基本用法详解
上篇分享了数据分析用到的一个库:Numpy 库,今天分享一个比 Numpy 更高效的库:pandas,它可以对数据进行导入、清洗、处理、统计和输出。pandas 是基于 Numpy 库的,可以说,pandas 库就是为数据分析而生的。
环境
语言:Python 3.6
安装&导入
用 pip 命令快速安装 pandas 库。
Python
pip install pandas
1
pip install pandas
安装完后再编辑器中导入。
Python
import pandas as pd
1
import pandas as pd
读取文件
读取你的 excel 文件,并另存为 csv 格式的文件。
Python
import pandas as pd
from pandas import DataFrame, Series
df = DataFrame(pd.read_excel('test.xlsx'))
df.to_csv('test1.csv')
print(df)
1
2
3
4
5
6
importpandasaspd
frompandasimportDataFrame,Series
df=DataFrame(pd.read_excel('test.xlsx'))
df.to_csv('test1.csv')
print(df)
读取过程中可能会报错,提示你缺少 xlrd 模块的情况,用 pip 命令安装即可。
打印出读取到的数据,我们发现,文件中单元格为空的数据以 NAN 代替了。
当然,也可以直接读取文件并打印,不给参数的话默认只打印前 5 行数据。以我之前爬取的热门歌手文件为例。
Python
import pandas as pd
from pandas import DataFrame, Series
df = DataFrame(pd.read_excel('歌手.xlsx'))
print(df.head(8))
1
2
3
4
5
importpandasaspd
frompandasimportDataFrame,Series
df=DataFrame(pd.read_excel('歌手.xlsx'))
print(df.head(8))
打印结果如下:
Python
歌手名字 歌手ID
0 周杰伦 6452
1 陈奕迅 2116
2 薛之谦 5781
3 林俊杰 3684
4 李荣浩 4292
5 张学友 6460
6 杨宗纬 6066
7 许巍 5770
1
2
3
4
5
6
7
8
9
歌手名字歌手ID
0周杰伦6452
1陈奕迅2116
2薛之谦5781
3林俊杰3684
4李荣浩4292
5张学友6460
6杨宗纬6066
7许巍5770
清洗数据
我们知道,从事数据分析工作的,80% 的时间都花在数据清洗上面,因为我们从各个渠道获取的信息格式不统一,我们需要对他们进行清洗。
清洗数据主要内容如下:
删除 DataFrame 中的不必要列和行。
重命名 columns 为一组更易识别的标签。
更改数据格式。
去除数据间空格或者特定字符。
去除重复的行。
查找空值。
删除行或者列
我们还是以刚才歌手信息为例,为了看删除效果,我加了一列信息:性别,下面只显示部分信息。
Python
歌手名字 歌手ID 性别
0 周杰伦 6452 男
1 陈奕迅 2116 男
2 薛之谦 5781 男
3 林俊杰 3684 男
4 李荣浩 4292 男
5 张学友 6460 男
6 杨宗纬 6066 男
7 许巍 5770 男
1
2
3
4
5
6
7
8
9
歌手名字歌手ID性别
0周杰伦6452男
1陈奕迅2116男
2薛之谦5781男
3林俊杰3684男
4李荣浩4292男
5张学友6460男
6杨宗纬6066男
7许巍5770男
删除性别这一列。
Python
import pandas as pd
from pandas import DataFrame, Series
df = DataFrame(pd.read_excel('歌手.xlsx'))
df1 = df.drop(columns=['性别'])
print(df1)
1
2
3
4
5
6
importpandasaspd
frompandasimportDataFrame,Series
df=DataFrame(pd.read_excel('歌手.xlsx'))
df1=df.drop(columns=['性别'])
print(df1)
执行后发现刚加的「性别」这一列已被删除。
删除某一行,比如删除李荣浩这一行信息,我们通过上面可以知道这一行的 index 是 4。
Python
import pandas as pd
from pandas import DataFrame, Series
df = DataFrame(pd.read_excel('歌手.xlsx'))
df1 = df.drop(index=['李荣浩'])
print(df1)
1
2
3
4
5
6
importpandasaspd
frompandasimportDataFrame,Series
df=DataFrame(pd.read_excel('歌手.xlsx'))
df1=df.drop(index=['李荣浩'])
print(df1)
执行后结果如下,我们发现,index 为 4 的这一行信息已被删除。
Python
歌手名字 歌手ID 性别
0 周杰伦 6452 男
1 陈奕迅 2116 男
2 薛之谦 5781 男
3 林俊杰 3684 男
5 张学友 6460 男
6 杨宗纬 6066 男
7 许巍 5770 男
1
2
3
4
5
6
7
8
歌手名字歌手ID性别
0周杰伦6452男
1陈奕迅2116男
2薛之谦5781男
3林俊杰3684男
5张学友6460男
6杨宗纬6066男
7许巍5770男
重命名列名
用 rename 方法将列名修改成自己需要的列名,比如歌手名字换成 SName。
Python
import pandas as pd
from pandas import DataFrame, Series
df = DataFrame(pd.read_excel('歌手.xlsx'))
df.rename(columns={'歌手名字': 'SName'}, inplace=True)
print(df)
1
2
3
4
5
6
importpandasaspd
frompandasimportDataFrame,Series
df=DataFrame(pd.read_excel('歌手.xlsx'))
df.rename(columns={'歌手名字':'SName'},inplace=True)
print(df)
更改数据格式
用 astype 更改数据格式。
Python
df = DataFrame(pd.read_excel('歌手.xlsx'))
df1 = df['歌手ID'].astype('str')
1
2
df=DataFrame(pd.read_excel('歌手.xlsx'))
df1=df['歌手ID'].astype('str')
删除数据间空格
Python
df = DataFrame(pd.read_excel('歌手.xlsx'))
df['歌手名字'] = df['歌手名字'].map(str.strip) # 删除左右两边空格
df['歌手名字'] = df['歌手名字'].map(str.lstrip) # 删除左边空格
df['歌手名字'] = df['歌手名字'].map(str.rstrip) # 删除右边空格
1
2
3
4
df=DataFrame(pd.read_excel('歌手.xlsx'))
df['歌手名字']=df['歌手名字'].map(str.strip)# 删除左右两边空格
df['歌手名字']=df['歌手名字'].map(str.lstrip)# 删除左边空格
df['歌手名字']=df['歌手名字'].map(str.rstrip)# 删除右边空格
去除重复的行
用自带的方法一行代码可以搞定。
Python
df = DataFrame(pd.read_excel('歌手.xlsx'))
df = df.drop_duplicates()
1
2
df=DataFrame(pd.read_excel('歌手.xlsx'))
df=df.drop_duplicates()
查找空值
我们可以用 isnull 方法查找数据中的空值或者 NAN,返回的是 Boolean 类型,False 表示不是空值,True 表示空值。
Python
df = DataFrame(pd.read_excel('歌手.xlsx'))
df = df.isnull()
print(df)
1
2
3
df=DataFrame(pd.read_excel('歌手.xlsx'))
df=df.isnull()
print(df)
为了展示效果,我执行前去掉了第 5 行的信息,所以第 5 行出现一个 True。
Python
歌手名字 歌手ID
0 False False
1 False False
2 False False
3 False False
4 True False
1
2
3
4
5
6
歌手名字歌手ID
0FalseFalse
1FalseFalse
2FalseFalse
3FalseFalse
4TrueFalse
数据统计
上周讲 Numpy 库时也讲到了对数据的统计,计算数据最大值、最小值、平均值、方差、标准差等。pandas 也可以做这些工作,而且 pandas 中的 describe 可以直接显示这个数据。
我们先创建一个科目成绩的数据。
Python
df = DataFrame({'subject': ['语', '数', '外', '理', '化'], 'data': range(90, 95)})
print(df)
1
2
df=DataFrame({'subject':['语','数','外','理','化'],'data':range(90,95)})
print(df)
数据如下:
Python
subject data
0 语 90
1 数 91
2 外 92
3 理 93
4 化 94
1
2
3
4
5
6
subjectdata
0语90
1数91
2外92
3理93
4化94
我们用 describe 方法直接显示这些统计数据。
Python
df = DataFrame({'subject': ['语', '数', '外', '理', '化'], 'data': range(90, 95)})
print(df.describe())
1
2
df=DataFrame({'subject':['语','数','外','理','化'],'data':range(90,95)})
print(df.describe())
结果如下:
Python
data
count 5.000000
mean 92.000000
std 1.581139
min 90.000000
25% 91.000000
50% 92.000000
75% 93.000000
max 94.000000
1
2
3
4
5
6
7
8
9
data
count5.000000
mean92.000000
std1.581139
min90.000000
25%91.000000
50%92.000000
75%93.000000
max94.000000
多表合并
如果我们有多个数据表,我们需要对他进行合并处理。以下这些知识点和 SQL 很相似,如果你对 SQL 语句熟悉的话,以下很容易理解
对相同的列进行合并
Python
df1 = DataFrame({'subject': ['语', '数', '外', '理', '化'], 'data': range(90, 95)})
df2 = DataFrame({'subject': ['语', '数', '外', '史', '地'], 'data': range(90, 95)})
df3 = pd.merge(df1, df2, on='subject')
print(df3)
1
2
3
4
df1=DataFrame({'subject':['语','数','外','理','化'],'data':range(90,95)})
df2=DataFrame({'subject':['语','数','外','史','地'],'data':range(90,95)})
df3=pd.merge(df1,df2,on='subject')
print(df3)
两个表中,语数外是相同的,进行合并,结果如下:
Python
subject data_x data_y
0 语 90 90
1 数 91 91
2 外 92 92
1
2
3
4
subjectdata_xdata_y
0语9090
1数9191
2外9292
内连接
也就是两个数据表中的交集部分。
Python
df1 = DataFrame({'subject': ['语', '数', '外', '理', '化'], 'data': range(90, 95)})
df2 = DataFrame({'subject': ['语', '数', '外', '史', '地'], 'data': range(90, 95)})
df3 = pd.merge(df1, df2, how='inner')
print(df3)
1
2
3
4
df1=DataFrame({'subject':['语','数','外','理','化'],'data':range(90,95)})
df2=DataFrame({'subject':['语','数','外','史','地'],'data':range(90,95)})
df3=pd.merge(df1,df2,how='inner')
print(df3)
结果显示两个表中相同的数据。
Python
subject data
0 语 90
1 数 91
2 外 92
1
2
3
4
subjectdata
0语90
1数91
2外92
左连接
以左表为主,右表只显示交集部分的数据。
Python
df1 = DataFrame({'subject': ['语', '数', '外', '理', '化'], 'data': range(90, 95)})
df2 = DataFrame({'subject': ['语', '数', '外', '史', '地'], 'data': range(90, 95)})
df3 = pd.merge(df1, df2, how='left')
print(df3)
1
2
3
4
df1=DataFrame({'subject':['语','数','外','理','化'],'data':range(90,95)})
df2=DataFrame({'subject':['语','数','外','史','地'],'data':range(90,95)})
df3=pd.merge(df1,df2,how='left')
print(df3)
执行结果:
Python
subject data
0 语 90
1 数 91
2 外 92
3 理 93
4 化 94
1
2
3
4
5
6
subjectdata
0语90
1数91
2外92
3理93
4化94
右连接
以右表为主,左表只显示交集部分的数据。
Python
df1 = DataFrame({'subject': ['语', '数', '外', '理', '化'], 'data': range(90, 95)})
df2 = DataFrame({'subject': ['语', '数', '外', '史', '地'], 'data': range(90, 95)})
df3 = pd.merge(df1, df2, how='right')
print(df3)
1
2
3
4
df1=DataFrame({'subject':['语','数','外','理','化'],'data':range(90,95)})
df2=DataFrame({'subject':['语','数','外','史','地'],'data':range(90,95)})
df3=pd.merge(df1,df2,how='right')
print(df3)
执行结果:
Python
subject data
0 语 90
1 数 91
2 外 92
3 史 93
4 地 94
1
2
3
4
5
6
subjectdata
0语90
1数91
2外92
3史93
4地94
全连接
显示两个表数据的并集。
Python
df1 = DataFrame({'subject': ['语', '数', '外', '理', '化'], 'data': range(90, 95)})
df2 = DataFrame({'subject': ['语', '数', '外', '史', '地'], 'data': range(90, 95)})
df3 = pd.merge(df1, df2, how='outer')
print(df3)
1
2
3
4
df1=DataFrame({'subject':['语','数','外','理','化'],'data':range(90,95)})
df2=DataFrame({'subject':['语','数','外','史','地'],'data':range(90,95)})
df3=pd.merge(df1,df2,how='outer')
print(df3)
执行结果:
Python
subject data
0 语 90
1 数 91
2 外 92
3 理 93
4 化 94
5 史 93
6 地 94
1
2
3
4
5
6
7
8
subjectdata
0语90
1数91
2外92
3理93
4化94
5史93
6地94
pandas 库的对于数据分析的基本用法就介绍到这里。
python中的pandas库_数据分析中 pandas 库的基本用法详解相关推荐
- python中 for i in range(10)_Python for i in range ()用法详解
for i in range ()作用: range()是一个函数, for i in range () 就是给i赋值: 比如 for i in range (1,3): 就是把1,2依次赋值给i r ...
- linux中的su-命令的功能,linux su命令参数及用法详解(linux切换用户命令)
linux su命令参数及用法详解(linux切换用户命令) 发布时间:2012-07-21 12:12:39 作者:佚名 我要评论 su的作用是变更为其它使用者的身份,超级用户除外,需要键入 ...
- 【Scripts系列】之Makefile中条件分支ifeq/else/endif/else ifeq/ifneq/ifdef/ifndef用法详解
DATE: 2019-2-22 前言 条件分支的用法在任何编程语言和脚本以及逻辑中都广泛使用.前文讲述过C语言中预处理的条件编译#ifdef/#if/#elif/#else/#endif用 ...
- linux中whoami命令的作用是,linux whoami命令参数及用法详解(linux查看登陆用户名)
linux whoami命令参数及用法详解(linux查看登陆用户名) 2019年05月31日 | 萬仟网科技 | 我要评论 whoami 命令显示登录名.与使用命令 who 并指定 am i 不同, ...
- java string()函数_转载java String.split()函数的用法详解
转载java String.split()函数的用法详解 如果您发现本文排版有问题,可以先点击下面的链接切换至老版进行查看!!!在java.lang包中有String.split()方法的原型是: p ...
- 汇编语言典型例子详解_数据分析常用的7大思维方法详解
今天老李继续给大家讲解数据分析经典的思维模型,上篇为大家介绍了目标思维.假设思维.溯源思维.逆向思维4个思维:数据分析必备7大经典模型详解!建议收藏!(上) 今天继续给大家介绍结构思维.演绎推理思维. ...
- pivot sqlserver 条件_行转列之SQLSERVERPIVOT与用法详解
在数据库操作中,有些时候我们遇到需要实现"行转列"的需求,例如一下的表为某店铺的一周收入情况表: WEEK_INCOME(WEEK VARCHAR(10),INCOME DECIM ...
- python中map()和dict()怎么用?你知道吗?-用法详解
map()用法 map()是python的内置函数,会根据提供的函数对指定序列做映射. 语法: map(func, iter, ...) 其中func为一个功能函数,iter表示可迭代参数序列.map ...
- mysql中时间处理函数_基于mysql时间处理函数的应用详解
DAYOFWEEK(date) 返回日期date的星期索引(1=星期天,2=星期一, --7=星期六).这些索引值对应于ODBC标准. mysql> select DAYOFWEEK('1998 ...
最新文章
- 线性模型的最小二乘法拟合(转)
- 面试之作用域链与闭包
- C++ 对象内存布局 (4)
- 分酒问题matlab代码,matlab葡萄酒分类数据归一化问题
- python使用json实现树结构_js怎样将获取json转换为树形结构
- Gentoo Linux 内核指南
- Java集成建行龙支付接口(详细)
- 《C#语言和数据库技术基础》单词必备
- 把C盘正好分成100G的数值
- 吴恩达机器学习中文版课后题(中文题目+数据集+python版答案)week1 线性回归
- 关于mysql中无法显示中文的完美解决方案
- 美国国防高级研究计划局(DARPA)组织管理运行机制分析
- 【实时渲染】RTR4 简要问答版
- iPhone、iPad、Android UI常用设计尺寸
- 二叉树线索化仍不能解决的两个问题及原因
- 「轻阅读」京东到家订单中心系统mysql到es的转化之路
- 基于stm32的汽车智能充电桩设计/单片机/毕业设计/课程设计
- 关于百度和Google的中文搜索
- 10.7 剪草 2394
- 别名机制alias详解——一个让你少敲键盘的偷懒方式
热门文章
- 基于微信小程序平台实现二手物品交易小程序设计【附项目源码】
- 聚集索引扫描97%_聚集前1%:R中的资产分析
- 渝粤题库 陕西师范大学 《幼儿园管理学》考评作业
- 定义抽象类Person、派生类Student和类Teacher
- 计算机网络错误是什么意思,电脑网络错误00050是什么意思?
- Web网络安全基础入门总笔记
- Java源码解析系列(一) Java集合框架
- 50k*16 薪,可以跳了!
- 【已解决】Ubuntu U盘启动出现“Failed to load ldlinux.c32”问题
- 通过梯度下降和牛顿法求解一个数的平方根