Python数据处理笔记03--pandas数据结构

Python数据处理笔记01--numpy数组操作

Python数据处理笔记02--numpy矩阵操作 

声明:本文环境为Windows10+jupyter notebook,请自行下载安装Anaconda 

引言:

  • Pandas是基于Numpy的一种工具,该工具是为了解决数据分析任务而创建的
  • Pandas纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具
  • Pandas提供了大量能使我们快速便捷地处理数据的函数和方法
  • Pandas是Python的一个数据分析包,由PyData开发团队继续开发和维护
  • Pandas最初被作为金融数据分析工具而开发出来,也为时间序列提供了很好的支持

【Pandas库介绍】

pandas是Python第三方库,提供高性能医用数据类型和分析工具

pandas基于numpy实现,常与numpy和matplotlib一同使用

pandas有两大核心数据结构Series(一维数据)和DataFrame(多特征数据,既有行索引,又有列索引)

》》Series:

一维数组,与Numpy中的一维数组类似

Series、Numpy中的一维array与Python基本的数据结构list也很相近,其区别是:list中的元素可以是不同的数据类型,而array和Series中则只允许存储相同的数据类型

Series可以更有效的使用内存,提高运算效率

》》Time-Series:以时间为索引的Series

》》DataFrame:带标签且可变大小可变的二维表格型数据结构,可以将DataFrame理解为Series的容器

》》Panel:三维的数组,可以理解为DataFrame的容器

Series

Series是一种类似于一维数组的对象,它由一维数组(各种numpy数据类型)以及一组与之相关的数据标签(即索引)组成。

Series创建函数:

pandas.Series(data,index,dtype,copy)
参数描述
data数据采集样式,如:ndarray,list,constants
index索引值必须是唯一的和三列的,与数据的长度相同。默认np.arange(n)如果没有索引被传递
dtype

dtype用于数据类型。如果没有,将推断数据类型

copy复制数据,默认为false

Series的创建:

  •     使用Python数组创建
  •     使用numpy数组创建
  •     使用python字典创建

注意:与字典不同的是:Series允许索引重复

>> import pandas as pd
>> import numpy as np
>> pd.Series([11,12],index=["北京","上海"])
北京    11
上海    12
dtype: int64
>> pd.Series(np.arange(3,6))
0    3
1    4
2    5
dtype: int32
>> pd.Series({"北京":11,"上海":12,"深圳":14})
北京    11
上海    12
深圳    14
dtype: int64

【Series】

  • Series的字符串表现形式为:索引在左边,值在右边
  • 如果没有为数据指定索引,则自动创建一个0到N-1(N为数据长度)的整数型索引
  • 可以通过Series的values和index属性获取其数组表示形式和索引对象
  • 与普通numpy数组相比,可以通过索引的方式选取Series中的单个或一组值
>> obj = pd.Series([4,7,-5,3])
>> obj.values
array([ 4,  7, -5,  3], dtype=int64)
>> obj.index
RangeIndex(start=0, stop=4, step=1)
>> obj[2]
-5

>> obj[[0,1,3]]
0    4
1    7
3    3
dtype: int64

【Series】

  • 通常希望创建的Series带有一个可以对各个数据点进行标记的索引
  • 与普通Numpy数组相比,可以通过索引的方式取Series中的单个或一组值
>> obj2 = pd.Series([4,2,-5,3],index=['a','b','c','d'])  # 指定索引键值
>> obj2
a    4
b    2
c   -5
d    3
dtype: int64
>> obj2['a']
4
>> obj2['d']=6
>> obj2
a    4
b    2
c   -5
d    6
dtype: int64

series中一个很重要的功能是:它会在算术运算中自动对齐不同索引的数据

>> obj2 = pd.Series({"Ohio":3500,"Oregon":1600,"Texas":7100,"Utah":5000})
>> obj3 = pd.Series({"California":np.nan,"Ohio":3500,"Oregon":1600,"Texas":7100})
>> obj2+obj3
California        NaN
Ohio           7000.0
Oregon         3200.0
Texas         14200.0
Utah              NaN
dtype: float64
  • series对象本身及其索引都有一个name属性
  • Series的索引可以通过赋值的方式就地更改
>> obj3.name='population'
>> obj3.index.name='state'
>> obj3

state
California       NaN
Ohio          3500.0
Oregon        1600.0
Texas         7100.0
Name: population, dtype: float64

>> obj = pd.Series([4,7,-5,3])
>> obj.index=['Bob','Steve','Jeff','Ryan']
>> obj
Bob      4
Steve    7
Jeff    -5
Ryan     3
dtype: int64

【DataFrame】

  • DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值烈性(数值、字符串、布尔值)
  • DataFrame既有行索引也有列索引,它可以看做由Series组成的字典(公用同一个索引)
  • 跟其他类似的数据结构相比(如R语言的data.frame),DataFrame中面向行和面向列的操作基本上是平衡的
  • DataFrame中的数据是以一个或者多个二维快存放的(而不是列表、字典或别的一维数据结构)

特点:

  • 潜在的列是不同的类型
  • 大小可变
  • 标记轴(行和列)
  • 可以对行和列执行算数运算

DataFrame构造函数

pandas.DataFrame(data,index,columns,dtype,copy)
参数描述
data数据采取各种形式,如:ndarray,series,map,lists,dict,constant和另一个DataFrame
index对于行标签,要用与结果帧的索引是可选缺省值np.arrange(n),如果没有传递索引值
columns对于列标签,可选的默认语法是np.arange(n),这只是在没有索引传递的情况下才是这样
dtype每列的数据类型
copy如果默认值为False,则此命令(或任何它)用于复制数据
  • 创建一个空的DataFrame:函数不指定返回空的DataFrame
# 创建一个空的DataFrame

import pandas as pd
df = pd.DataFrame()
print(df)

运行结果: 

Empty DataFrame
Columns: []
Index: []
  • 从列表创建DataFrame
# 从嵌套列表创建DataFrame,并指定数据类型
import pandas as pd
data = [['Alex',10],['Bob',12],['Clarke',13]]
df = pd.DataFrame(data,columns=['Name','Age'],dtype=float)
print(df)

运行结果:

 Name   Age
0    Alex  10.0
1     Bob  12.0
2  Clarke  13.0
  • 由等长列表或numpy数组组成的字典创建DataFrame
  • DataFrame结果会自动加上索引(跟Series一样),且全部被有序排列
import pandas as pd
data = {'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],'year':[2000,2001,2002,2001,2002],'pop':[1.5,1.7,3.6,2.4,2.9]}
frame = pd.DataFrame(data)
frame

输出结果:

 

   state  year  pop
0    Ohio  2000  1.5
1    Ohio  2001  1.7
2    Ohio  2002  3.6
3  Nevada  2001  2.4
4  Nevada  2002  2.9

 而在jupyter notebook的产生效果则是这样的:好像自动生成了一个表格

  • 如果指定了列顺序,则DataFrame的列就睡按照指定顺序进行排列
  • 跟原Series一样,如果传入的列在数据中找不到,就会产生NaN值
>> pd.DataFrame(data,columns=['year','state','pop'])
 year   state  pop
0  2000    Ohio  1.5
1  2001    Ohio  1.7
2  2002    Ohio  3.6
3  2001  Nevada  2.4
4  2002  Nevada  2.9

jupyter notebook视图效果为:

>> frame2 = pd.DataFrame(data,columns=['year','state','pop','debt'],index=['one','two','three','four','five'])
>> print(frame2)
    year   state  pop debt
one    2000    Ohio  1.5  NaN
two    2001    Ohio  1.7  NaN
three  2002    Ohio  3.6  NaN
four   2001  Nevada  2.4  NaN
five   2002  Nevada  2.9  NaN
1
​

jupyter notebook视图效果为:

>> frame2.columns
Index(['year', 'state', 'pop', 'debt'], dtype='object')
  • 通过类似字典标记的方式或属性的方式,可以将DataFrame的列获取为一个Series
  • 返回的Series用于原DataFrame相同的索引,且其name属性也已经被相应地设置好了
# 将DataFrame获取为一个Series
>> frame2['state']
one        Ohio
two        Ohio
three      Ohio
four     Nevada
five     Nevada
Name: state, dtype: object

>>frame2['year'] 
one      2000
two      2001
three    2002
four     2001
five     2002
Name: year, dtype: int64
  • 列可以通过赋值的方式进行修改
  • 例如,给那个空的“delt”列赋上一个标量值或一组值
>> frame2['debt']=16.5
>> print(frame2)
   year   state  pop  debt
one    2000    Ohio  1.5  16.5
two    2001    Ohio  1.7  16.5
three  2002    Ohio  3.6  16.5
four   2001  Nevada  2.4  16.5
five   2002  Nevada  2.9  16.5

jupyter notebook视图效果为:

>> frame2['debt']=np.arange(5.0)
>> print(frame2)
      year   state  pop  debt
one    2000    Ohio  1.5   0.0
two    2001    Ohio  1.7   1.0
three  2002    Ohio  3.6   2.0
four   2001  Nevada  2.4   3.0
five   2002  Nevada  2.9   4.0

 jupyter notebook视图效果为:

  • 将列表或数组赋值给某个列时,其长度必须跟DataFrame的长度相匹配
  • 如果赋值的是一个Series,就会精确匹配DataFrame的索引,所有空位都将被天填上缺失值
>> val = pd.Series([-1.2,1.5,1.7],index=['two','four','five'])
>> frame2['debt'] = val
>> print(frame2)
  year   state  pop  debt
one    2000    Ohio  1.5   NaN
two    2001    Ohio  1.7  -1.2
three  2002    Ohio  3.6   NaN
four   2001  Nevada  2.4   1.5
five   2002  Nevada  2.9   1.7

 jupyter notebook视图效果为:

  • 为不存在的列赋值会创建出一个新列
  • 关键字del用于删除列
>> frame2['eastern']=frame2.state=='Ohio'
>> print(frame2)
  year   state  pop  debt  eastern
one    2000    Ohio  1.5   NaN     True
two    2001    Ohio  1.7  -1.2     True
three  2002    Ohio  3.6   NaN     True
four   2001  Nevada  2.4   1.5    False
five   2002  Nevada  2.9   1.7    False

  jupyter notebook视图效果为:

>> del frame2['eastern']
>> frame2.columns
Index(['year', 'state', 'pop', 'debt'], dtype='object')
  • 将嵌套字典(也就是字典的字典)传给DataFrame,他就会被解释为:外层字典的键作为列,内层键则作为行索引
  • 也可以对上述结果进行转置
>> pop = {'Nevada':{2001:2.4,2002:2.9},'Ohio':{2000:1.5,2001:1.7,2002:3.6}}
>> frame3 = pd.DataFrame(pop)
>> print(frame3)
    Nevada  Ohio
2001     2.4   1.7
2002     2.9   3.6
2000     NaN   1.5

  jupyter notebook视图效果为:

>> print(frame3.T)
 2001  2002  2000
Nevada   2.4   2.9   NaN
Ohio     1.7   3.6   1.5

  jupyter notebook视图效果为:

  • 如果设置了DataFrame的index和columns的name属性,则这些信息也会被显示出来
>> frame3.index.name='year'
>> frame3.columns.name='state'
>> frame3

  • 跟Series一样,values属性也会以二维ndarray的形式返回DataFrame中的数据
  • 如果DataFrame各列的数据类型不同,则数组的数据类型就会选用能兼容所有列的数据
>> frame3.values
array([[2.4, 1.7],
       [2.9, 3.6],
       [nan, 1.5]])
>> frame2.values
array([[2000, 'Ohio', 1.5, nan],
       [2001, 'Ohio', 1.7, -1.2],
       [2002, 'Ohio', 3.6, nan],
       [2001, 'Nevada', 2.4, 1.5],
       [2002, 'Nevada', 2.9, 1.7]], dtype=object)

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值