python pandas模块基础学习详解


Posted in Python onJuly 03, 2019

Pandas类似R语言中的数据框(DataFrame),Pandas基于Numpy,但是对于数据框结构的处理比Numpy要来的容易。

1. Pandas的基本数据结构和使用

Pandas有两个主要的数据结构:Series和DataFrame。Series类似Numpy中的一维数组,DataFrame则是使用较多的多维表格数据结构。

Series的创建

>>>import numpy as np
>>>import pandas as pd
>>>s=pd.Series([1,2,3,np.nan,44,1]) # np.nan创建一个缺失数值
>>>s # 若未指定,Series会自动建立index,此处自动建立索引0-5
0   1.0
1   2.0
2   3.0
3   NaN
4  44.0
5   1.0
dtype: float64

DataFrame的创建

>>>dates=pd.date_range('20170101',periods=6)
>>>dates
DatetimeIndex(['2017-01-01', '2017-01-02', '2017-01-03', '2017-01-04',
        '2017-01-05', '2017-01-06'],
       dtype='datetime64[ns]', freq='D')
>>>df=pd.DataFrame(np.random.randn(6,4),index=dates,columns=['a','b','c','d'])
>>>df
           a     b     c     d
2017-01-01 -1.993447 1.272175 -1.578337 -1.972526
2017-01-02 0.092701 -0.503654 -0.540655 -0.126386
2017-01-03 0.191769 -0.578872 -1.693449 0.457891
2017-01-04 2.121120 0.521884 -0.419368 -1.916585
2017-01-05 1.642063 0.222134 0.108531 -1.858906
2017-01-06 0.636639 0.487491 0.617841 -1.597920

DataFrame可以跟Numpy一样根据索引取出其中的数据,只是DataFrame索引方式更加多样化。DataFrame不仅可以根据默认的行列编号来索引,还可以根据标签序列来索引。

还可以采用字典的方式创建DataFrame:

>>>df2=pd.DataFrame({'a':1,'b':'hello kitty','c':np.arange(2),'d':['o','k']})
>>>df2
   a      b c d
0 1 hello kitty 0 o
1 1 hello kitty 1 k

对于DataFrame的一些属性也可以采用相应的方法查看

dtype # 查看数据类型
index # 查看行序列或者索引
columns # 查看各列的标签
values # 查看数据框内的数据,也即不含表头索引的数据
describe # 查看数据的一些信息,如每一列的极值,均值,中位数之类的,只能对数值型数据统计信息
transpose # 转置,也可用T来操作
sort_index # 排序,可按行或列index排序输出
sort_values # 按数据值来排序

一些例子

>>>df2.dtypes
a   int64
b  object
c   int64
d  object
dtype: object
>>>df2.index
RangeIndex(start=0, stop=2, step=1)
>>>df2.columns
Index(['a', 'b', 'c', 'd'], dtype='object')
>>>df2.values
array([[1, 'hello kitty', 0, 'o'],
    [1, 'hello kitty', 1, 'k']], dtype=object)
>>>df2.describe # 只能对数值型数据统计信息
     a     c
count 2.0 2.000000
mean  1.0 0.500000
std  0.0 0.707107
min  1.0 0.000000
25%  1.0 0.250000
50%  1.0 0.500000
75%  1.0 0.750000
max  1.0 1.000000
>>>df2.T
       0      1
a      1      1
b hello kitty hello kitty
c      0      1
d      o      k
>>>df2.sort_index(axis=1,ascending=False) # axis=1 按列标签从大到小排列
   d c      b a
0 o 0 hello kitty 1
1 k 1 hello kitty 1
>>>df2.sort_index(axis=0,ascending=False) # 按行标签从大到小排序
   a      b c d
1 1 hello kitty 1 k
0 1 hello kitty 0 o
>>>df2.sort_values(by="c",ascending=False) # 按c列的值从大到小排序
   a      b c d
1 1 hello kitty 1 k
0 1 hello kitty 0 o

2. 从DataFrame中筛选取出目的数据

从DataFrame中取出目的数据方法有多种,一般常用的有:

  •  - 直接根据索引选取
  •  - 根据标签选取(纵向选择列):loc
  •  - 根据序列(横向选择行): iloc
  •  - 组合使用标签序列来选取特定位置的数据: ix
  •  - 通过逻辑判断筛选

简单选取

>>>import numpy as np
>>>import pandas as pd
>>>dates=pd.date_range('20170101',periods=6)
>>>df=pd.DataFrame(np.arange(24).reshape((6,4)),index=dates,columns=['a','b','c','d'])
>>>df
        a  b  c  d
2017-01-01  0  1  2  3
2017-01-02  4  5  6  7
2017-01-03  8  9 10 11
2017-01-04 12 13 14 15
2017-01-05 16 17 18 19
2017-01-06 20 21 22 23
>>>df['a']     # 根据表签直接选取a列,也可用df.a,结果相同
2017-01-01   0
2017-01-02   4
2017-01-03   8
2017-01-04  12
2017-01-05  16
2017-01-06  20
Freq: D, Name: a, dtype: int64
>>>df[0:3]  # 选择前3行,也可用行标签 df['2017-01-01':'2017-01-03'],结果相同,但是无法用此法选择多列
       a b  c  d
2017-01-01 0 1  2  3
2017-01-02 4 5  6  7
2017-01-03 8 9 10 11

loc使用显式的行标签来选取数据

DataFrame行的表示方式有两种,一种是通过显式的行标签来索引,另一种是通过默认隐式的行号来索引。loc方法是通过行标签来索引选取目标行,可以配合列标签来选取特定位置的数据。

>>>df.loc['2017-01-01':'2017-01-03']
       a b  c  d
2017-01-01 0 1  2  3
2017-01-02 4 5  6  7
2017-01-03 8 9 10 11
>>>df.loc['2017-01-01',['a','b']]  # 选取特定行的a,b列
a  0
b  1
Name: 2017-01-01 00:00:00, dtype: int64

iloc使用隐式的行序列号来选取数据

使用iloc可以搭配列序列号来更简单的选取特定位点的数据

>>>df.iloc[3,1]
13
>>>df.iloc[1:3,2:4]
        c  d
2017-01-02  6  7
2017-01-03 10 11

ix利用ix可以混用显式标签与隐式序列号

loc只能使用显式标签来选取数据,而iloc只能使用隐式序列号来选取数据,ix则能将二者结合起来使用。

>>> df.ix[3:5,['a','b']]
       a  b
2017-01-04 12 13
2017-01-05 16 17

使用逻辑判断来选取数据

>>>df
        a  b  c  d
2017-01-01  0  1  2  3
2017-01-02  4  5  6  7
2017-01-03  8  9 10 11
2017-01-04 12 13 14 15
2017-01-05 16 17 18 19
2017-01-06 20 21 22 23
>>>df[df['a']>5] # 等价于df[df.a>5]
        a  b  c  d
2017-01-03  8  9 10 11
2017-01-04 12 13 14 15
2017-01-05 16 17 18 19
2017-01-06 20 21 22 23

3. Pandas设置特定位置值

>>>import numpy as np
>>>import pandas as pd
>>>dates=pd.date_range('20170101',periods=6)
>>>datas=np.arange(24).reshape((6,4))
>>>columns=['a','b','c','d']
>>>df=pd.DataFra me(data=datas,index=dates,colums=columns)
>>>df.iloc[2,2:4]=111 # 将第2行2,3列位置的数据改为111
        a  b  c  d
2017-01-01  0  1  2  3
2017-01-02  4  5  6  7
2017-01-03  8  9 111 111
2017-01-04 12 13  14  15
2017-01-05 16 17  18  19
2017-01-06 20 21  22  23
>>>df.b[df['a']>10]=0 # 等价于df.b[df.a>10] # 以a列大于10的数的位置为参考,改变b列相应行的数值为0
        a b  c  d
2017-01-01  0 1  2  3
2017-01-02  4 5  6  7
2017-01-03  8 9 111 111
2017-01-04 12 0  14  15
2017-01-05 16 0  18  19
2017-01-06 20 0  22  23
>>>df['f']=np.nan  # 新建f列并设置数值为np.nan
       a b  c  d  f
2017-01-01  0 1  2  3 NaN
2017-01-02  4 5  6  7 NaN
2017-01-03  8 9 111 111 NaN
2017-01-04 12 0  14  15 NaN
2017-01-05 16 0  18  19 NaN
2017-01-06 20 0  22  23 NaN
>>>
# 用上面的方法也可以加上`Series`序列,但是必须与列长度一致
>>>df['e']=pd.Series(np.arange(6),index=dates)
>>>df
       a b  c  d  f e
2017-01-01  0 1  2  3 NaN 0
2017-01-02  4 5  6  7 NaN 1
2017-01-03  8 9 111 111 NaN 2
2017-01-04 12 0  14  15 NaN 3
2017-01-05 16 0  18  19 NaN 4
2017-01-06 20 0  22  23 NaN 5

4. 处理丢失数据

有时候我们的数据中会有一些空的或者缺失(NaN)数据,使用dropna可以选择性的删除或填补这些NaN数据。drop函数可以选择性的删除行或者列,drop_duplicates去除冗余。fillna则将NaN值用其他值替换。操作后不改变原值,若要保存更改需重新赋值。

>>>import numpy as np
>>>import pandas as pd
>>>df=pd.DataFrame(np.arange(24).reshape(6,4),index=pd.date_range('20170101',periods=6),columns=['a','b','c','d'])
>>>df
       a  b  c  d
2017-01-01  0  1  2  3
2017-01-02  4  5  6  7
2017-01-03  8  9 10 11
2017-01-04 12 13 14 15
2017-01-05 16 17 18 19
2017-01-06 20 21 22 23
>>>df.iloc[1,3]=np.nan
>>>di.iloc[3,2]=np.nan
>>>df.
       a  b   c   d
2017-01-01  0  1  2.0  3.0
2017-01-02  4  5  6.0  NaN
2017-01-03  8  9 10.0 11.0
2017-01-04 12 13  NaN 15.0
2017-01-05 16 17 18.0 19.0
2017-01-06 20 21 22.0 23.0
>>>df.dropna(axis=0,how='any') # axis=0(1)表示将含有NaN的行(列)删除。
   # how='any'表示只要行(或列,视axis取值而定)含有NaN则将该行(列)删除,
   # how='all'表示当某行(列)全部为NaN时才删除
       a  b   c   d
2017-01-01  0  1  2.0  3.0
2017-01-03  8  9 10.0 11.0
2017-01-05 16 17 18.0 19.0
2017-01-06 20 21 22.0 23.0
>>>df.fillna(value=55)
       a  b   c   d
2017-01-01  0  1  2.0  3.0
2017-01-02  4  5  6.0 55.0
2017-01-03  8  9 10.0 11.0
2017-01-04 12 13 55.0 15.0
2017-01-05 16 17 18.0 19.0
2017-01-06 20 21 22.0 23.0

还可以利用函数来检查数据中是否有或者全部为NaN

>>>np.any(df.isnull())==True
True
>>>np.all(df.isnull())==True
False

5. 数据的导入以及导出

一般excel文件以csv方式读入,pd.read_csv(file),data保存为filedata.to_csv(file)。

6. 数据添加合并

本节主要学习Pandas的一些简单基本的数据添加合并方法:concat,append。

concat合并方式类似于Numpy的concatenate方法,可横向或者竖向合并。

>>>import numpy as np
>>>import pandas as pd
>>> df1=pd.DataFrame(np.ones((3,4))*0,columns=['a','b','c','d'])
>>> df2=pd.DataFrame(np.ones((3,4))*1,columns=['a','b','c','d'])
>>> df3=pd.DataFrame(np.ones((3,4))*2,columns=['a','b','c','d'])
>>>res=pd.concat([df1,df2,df3],axis=0) 
# axis=0表示按行堆叠合并,axis=1表示按列左右合并
>>>res
    a  b  c  d
0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0
0 1.0 1.0 1.0 1.0
1 1.0 1.0 1.0 1.0
2 1.0 1.0 1.0 1.0
0 2.0 2.0 2.0 2.0
1 2.0 2.0 2.0 2.0
2 2.0 2.0 2.0 2.0
>>>
# 使用ignore_index=True参数可以重置行标签
>>>res=pd.concat([df1,df2,df3],axis=0,ignore_index=True)
>>>res
    a  b  c  d
0 0.0 0.0 0.0 0.0
1 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0
3 1.0 1.0 1.0 1.0
4 1.0 1.0 1.0 1.0
5 1.0 1.0 1.0 1.0
6 2.0 2.0 2.0 2.0
7 2.0 2.0 2.0 2.0
8 2.0 2.0 2.0 2.0

join参数提供了更多样化的合并方式。join=outer为默认值,表示将几个合并的数据都用上,具有相同列标签的合二为一,上下合并,不同列标签的独自成列,原来没有数值的位置以NaN填充;join=inner则只将具有相同列标签的(行)列上下合并,其余的列舍弃。简言之,outer代表并集,inner代表交集**。

>>>import numpy as np
>>>import pandas as pd
>>>df1=pd.DataFrame(np.ones((3,4)),index=[1,2,3],columns=['a','b','c','d'])
>>>df2=pd.DataFrame(np.ones((3,4))*2,index=[1,2,3],columns=['b','c','d','e'])
>>>res=pd.concat([df1,df2],axis=0,join='outer')
>>>res
    a  b  c  d  e
1 1.0 1.0 1.0 1.0 NaN
2 1.0 1.0 1.0 1.0 NaN
3 1.0 1.0 1.0 1.0 NaN
1 NaN 2.0 2.0 2.0 2.0
2 NaN 2.0 2.0 2.0 2.0
3 NaN 2.0 2.0 2.0 2.0
>>>res1=pd.concat([df1,df2],axis=1,join='outer') 
 # axis=1表示按列左右合并具有相同的行标签的,其余的各成一行,NaN补齐空缺
>>>res1
    a  b  c  d  b  c  d  e
1 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
2 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
3 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
>>>res2=pd.concat([df1,df2],axis=0,join='inner',ignore_index=True) 
# 将具有相同列标签的列上下合并
>>>res2
   b  c  d
0 1.0 1.0 1.0
1 1.0 1.0 1.0
2 1.0 1.0 1.0
3 2.0 2.0 2.0
4 2.0 2.0 2.0
5 2.0 2.0 2.0

join_axes参数可以设定参考系,以设定的参考来合并,参考系中没有的舍弃掉

>>>import numpy as np
>>>import pandas as pd
>>>df1=pd.DataFrame(np.ones((3,4)),index=[1,2,3],columns=['a','b','c','d'])
>>> df2=pd.DataFrame(np.ones((3,4))*2,index=[2,3,4],columns=['b','c','d','e'])
>>>res3=pd.concat([df1,df2],axis=0,join_axes=[df1.columns])
# 以df1的列标签为参考上下合并拥有相同列标签的列
>>>res3
    a  b  c  d
1 1.0 1.0 1.0 1.0
2 1.0 1.0 1.0 1.0
3 1.0 1.0 1.0 1.0
2 NaN 2.0 2.0 2.0
3 NaN 2.0 2.0 2.0
4 NaN 2.0 2.0 2.0
>>>res4=pd.concat([df1,df2],axis=1,join_axes=[df1.index])
# 以df1行标签为参考,左右合并拥有相同行标签的各列
    a  b  c  d  b  c  d  e
1 1.0 1.0 1.0 1.0 NaN NaN NaN NaN
2 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0
3 1.0 1.0 1.0 1.0 2.0 2.0 2.0 2.0

append只有上下合并,没有左右合并

>>>df1=pd.DataFrame(np.ones((3,4)),index=[1,2,3],columns=['a','b','c','d'])
>>> df2=pd.DataFrame(np.ones((3,4))*2,index=[2,3,4],columns=['b','c','d','e'])
>>>res5=df1.append(df2,ignore_index=True)
>>>res5
    a  b  c  d  e
0 1.0 1.0 1.0 1.0 NaN
1 1.0 1.0 1.0 1.0 NaN
2 1.0 1.0 1.0 1.0 NaN
3 NaN 2.0 2.0 2.0 2.0
4 NaN 2.0 2.0 2.0 2.0
5 NaN 2.0 2.0 2.0 2.0

7. Pandas高级合并:merge

merge合并与concat类似,只是merge可以通过一个或多个键将两个数据集的行连接起来。

merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, 
sort=False, suffixes=('_x', '_y'), copy=True, indicator=False)

参数说明:

  • left与right:两个不同的DataFrame
  • how:指的是合并(连接)的方式有inner(内连接),left(左外连接),right(右外连接),outer(全外连接);默认为inner
  • on : 指的是用于连接的列索引名称。必须存在右右两个DataFrame对象中,如果没有指定且其他参数也未指定则以两个DataFrame的列名交集做为连接键
  • left_on:左侧DataFrame中用作连接键的列名;这个参数中左右列名不相同,但代表的含义相同时非常有用。
  • right_on:右侧DataFrame中用作 连接键的列名
  • left_index:使用左侧DataFrame中的行索引做为连接键
  • right_index:使用右侧DataFrame中的行索引做为连接键
  • sort:默认为True,将合并的数据进行排序。在大多数情况下设置为False可以提高性能
  • suffixes:字符串值组成的元组,用于指定当左右DataFrame存在相同列名时在列名后面附加的后缀名称,默认为('_x','_y')
  • copy:默认为True,总是将数据复制到数据结构中;大多数情况下设置为False可以提高性能
  • indicator:显示合并数据中来源情况;如只来自己于左边(left_only)、两者(both)
>>>import pandas as pd
>>>df1=pd.DataFrame({'key':['k0','k1','k2','k3'],'A':['a0','a1','a2','a3'],'B':['b0','b1','b2','b3']})
>>>df2=pd.DataFrame({'key':['k0','k1','k2','k3'],'C':['c0','c1','c2','c3'],'D':['d0','d1','d2','d3']})
>>> res=pd.merge(df1,df2,on='key',indicator=True)
>>>res
  A  B key  C  D _merge
0 a0 b0 k0 c0 d0  both
1 a1 b1 k1 c1 d1  both
2 a2 b2 k2 c2 d2  both
3 a3 b3 k3 c3 d3  both

依据行index合并与依据列key合并用法类似

>>>res2=pd.merge(df1,df2,left_index=True,right_index=True,indicator=True)
>>>res2
  A  B key_x  C  D key_y _merge
0 a0 b0  k0 c0 d0  k0  both
1 a1 b1  k1 c1 d1  k1  both
2 a2 b2  k2 c2 d2  k2  both
3 a3 b3  k3 c3 d3  k3  both

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
pygame学习笔记(4):声音控制
Apr 15 Python
python保存网页图片到本地的方法
Jul 24 Python
Python推导式简单示例【列表推导式、字典推导式与集合推导式】
Dec 04 Python
Python生成器的使用方法和示例代码
Mar 04 Python
简单了解python高阶函数map/reduce
Jun 28 Python
利用python计算windows全盘文件md5值的脚本
Jul 27 Python
使用Python完成15位18位身份证的互转功能
Nov 06 Python
Python range与enumerate函数区别解析
Feb 28 Python
基于Python共轭梯度法与最速下降法之间的对比
Apr 02 Python
在echarts中图例legend和坐标系grid实现左右布局实例
May 16 Python
python实现canny边缘检测
Sep 14 Python
Python编解码问题及文本文件处理方法详解
Jun 20 Python
python将excel转换为csv的代码方法总结
Jul 03 #Python
pandas实现to_sql将DataFrame保存到数据库中
Jul 03 #Python
python实现控制COM口的示例
Jul 03 #Python
python pandas时序处理相关功能详解
Jul 03 #Python
在linux下实现 python 监控usb设备信号
Jul 03 #Python
django-allauth入门学习和使用详解
Jul 03 #Python
python使用mitmproxy抓取浏览器请求的方法
Jul 02 #Python
You might like
php中{}大括号是什么意思
2013/12/01 PHP
PHP随机生成随机个数的字母组合示例
2014/01/14 PHP
PHP 快速排序算法详解
2014/11/10 PHP
WordPress中用于检索模版的相关PHP函数使用解析
2015/12/15 PHP
YII Framework框架教程之国际化实现方法
2016/03/14 PHP
php下载文件,添加响应头的简单实例
2016/09/22 PHP
php 数组处理函数extract详解及实例代码
2016/11/23 PHP
thinkPHP5.0框架命名空间详解
2017/03/18 PHP
Yii2框架中日志的使用方法分析
2017/05/22 PHP
PHP+MariaDB数据库操作基本技巧备忘总结
2018/05/21 PHP
php实现简易计算器
2020/08/28 PHP
JS小功能(setInterval实现图片效果显示时间)实例代码
2013/11/28 Javascript
jquery实现多行文字图片滚动效果示例代码
2014/10/10 Javascript
jquery获取select选中值的方法分析
2015/12/22 Javascript
jQuery实现页面下拉100像素出现悬浮窗口的方法
2016/09/05 Javascript
React-router v4 路由配置方法小结
2017/08/08 Javascript
JS实现灯泡开关特效
2020/03/30 Javascript
vue项目中js-cookie的使用存储token操作
2020/11/13 Javascript
JavaScript this关键字的深入详解
2021/01/14 Javascript
[02:15]2015国际邀请赛选手档案IG.Ferrari 430
2015/07/30 DOTA
Python实现多行注释的另类方法
2014/08/22 Python
Django中更新多个对象数据与删除对象的方法
2015/07/17 Python
一张图带我们入门Python基础教程
2017/02/05 Python
Python中的__init__作用是什么
2020/06/09 Python
Python通过yagmail实现发送邮件代码解析
2020/10/27 Python
python绘图pyecharts+pandas的使用详解
2020/12/13 Python
美国儿童运动鞋和服装零售商:Kids Foot Locker
2017/08/05 全球购物
惠而浦美国官网:Whirlpool.com
2021/01/19 全球购物
巴西购物网站:Onofre Agora
2020/06/08 全球购物
介绍一下常见的木马种类
2014/11/15 面试题
简历的自荐信
2013/12/19 职场文书
幼儿园大班新学期寄语
2014/01/18 职场文书
《两只鸟蛋》教学反思
2014/02/10 职场文书
公司聚餐通知
2015/04/22 职场文书
未婚证明范本
2015/06/15 职场文书
uni-app 微信小程序授权登录的实现步骤
2022/02/18 Javascript