声明:本文环境为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)