pandas 是python的一个数据分析包,是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。提供了高效地操作大型数据集所需的工具,使得数据分析工作变着简单高效。
pandas数据结构介绍
Series是一种类似于一维数组的对象,它由一维组数(各种Numpy数据类型)以及一组与之相关的数据标签(即索引)组成。仅由一组数据即可产生最简单的Series
from pandas import Series,DataFrame
import pandas as pd
import numpy as np
obj=Series([4,7,-5,3])
obj
0 4
1 7
2 -5
3 3
dtype: int64
Series的字符串表现形式是:索引在左边,值在右边,由于没有为数据指定索引,就会自动创建一个0到N-1的整数型索引。可以通过Series的values和index属性获取其数组表示形式和索引对象。
obj.values
array([ 4, 7, -5, 3], dtype=int64)
obj.index
RangeIndex(start=0, stop=4, step=1)
我们希望创建的Series带有一个可以对各个数据点进行标记的索引
obj2=Series([4,7,-5,3],index=['d','b','a','c'])
obj2
d 4
b 7
a -5
c 3
dtype: int64
obj2.index
Index(['d', 'b', 'a', 'c'], dtype='object')
通过索引的方式选取Series中的一个或者一组值
obj2['a']
-5
obj2['d']=6
obj2[['c','a','d']]
c 3
a -5
d 6
dtype: int64
Numpy数组运算(如根据布尔型数组进行过滤、标量乘法、应用数学函数等)都会保留索引和值之间的连接。
obj2
d 6
b 7
a -5
c 3
dtype: int64
obj2[obj2>0]
d 6
b 7
c 3
dtype: int64
obj2*2
d 12
b 14
a -10
c 6
dtype: int64
np.exp(obj2)
d 403.428793
b 1096.633158
a 0.006738
c 20.085537
dtype: float64
可以将Series看成是一个定长的有序字典,因为它是索引值到数据值的一个映射。可以用在许多原本需要字典参数的函数中。
'b' in obj2
True
'k' in obj2
False
如果数据被存放在一个python字典中,通过这个字典来创建Series
sdata={'Ohio':35000,'Texas':71000,'Oregon':16000,'Utah':5000}
obj3=Series(sdata)
obj3
Ohio 35000
Oregon 16000
Texas 71000
Utah 5000
dtype: int64
states=['California','Ohio','Oregon','Texas']
obj4=Series(sdata,index=states)
obj4
California NaN
Ohio 35000.0
Oregon 16000.0
Texas 71000.0
dtype: float64
pandas的isnull和notnull函数可用于检测缺失数据
pd.isnull(obj4)
California True
Ohio False
Oregon False
Texas False
dtype: bool
pd.notnull(obj4)
California False
Ohio True
Oregon True
Texas True
dtype: bool
obj4.isnull()
California True
Ohio False
Oregon False
Texas False
dtype: bool
在算术运算中会自动对齐不同索引的数据
obj3
Ohio 35000
Oregon 16000
Texas 71000
Utah 5000
dtype: int64
obj4
California NaN
Ohio 35000.0
Oregon 16000.0
Texas 71000.0
dtype: float64
obj3+obj4
California NaN
Ohio 70000.0
Oregon 32000.0
Texas 142000.0
Utah NaN
dtype: float64
Series对象本身及其索引都有一个name属性,该属性跟padans其他的关键功能关系很密切
obj4.name='population'
obj4.index.name='state'
obj4
state
California NaN
Ohio 35000.0
Oregon 16000.0
Texas 71000.0
Name: population, dtype: float64
Series的索引可通过赋值的方式修改
obj.index=['Bob','Steve','Jeff','Ryan']
obj
Bob 4
Steve 7
Jeff -5
Ryan 3
dtype: int64
###DataFrame表格型数据结构 DataFrame含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等),有行索引也有列索引,可以看作是由Series组成的字典(共同用一个索引)。DataFrame中面向行和面向列的基本操作是平衡的。DataFrame中的数据是以一个或多个二维存放的(而不是列表、字典或别的一维数据结构) 构建DataFrame的办法很多种,最常用的一种是传入一个由等长列表或者Numpy数组组成的字典。
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=DataFrame(data)
frame
pop | state | year | |
---|---|---|---|
0 | 1.5 | Ohio | 2000 |
1 | 1.7 | Ohio | 2001 |
2 | 3.6 | Ohio | 2002 |
3 | 2.4 | Nevada | 2001 |
4 | 2.9 | Nevada | 2002 |
结果DataFrame会自动加上索引(跟Series一样),且全部列会被有序排列。
DataFrame的列会按照指定的列序指定顺序进行排列
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 |
和Series同样,如果传入的列在数据中找不到,会产生NA值
frame2=DataFrame(data,columns=['year','state','pop','debt'],index=['one','two','three','four','five'])
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 |
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
frame2.ix['three']
year 2002
state Ohio
pop 3.6
debt NaN
Name: three, dtype: object
列可以通过赋值的方式修改
frame2['debt']=16.5
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 |
frame2['debt']=np.arange(5.)
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 |
将数组或者列表赋值给某个列时,其长度需要跟DataFrame的长度相匹配,如果赋值的是一个Series,就会精确匹配DataFrame的索引,所有的空位都会填写上缺失值。
val=Series([-1.2,-1.5,-1.7],index=['two','four','five'])
frame2['debt']=val
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 |
为不存在的列赋值会创建一个新列,关键字del用于删除列
frame2['eastern']=frame2.state=='Ohio'
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 |
del frame2['eastern']
frame2.columns
Index(['year', 'state', 'pop', 'debt'], dtype='object')
嵌套字典,外层字典的键作为列,内层键作为行索引
pop={'Nevada':{2001:2.4,2002:2.9},
....:'Ohio':{2000:1.5,2001:107,2002:3.6}}
frame3=DataFrame(pop)
frame3
Nevada | Ohio | |
---|---|---|
2000 | NaN | 1.5 |
2001 | 2.4 | 107.0 |
2002 | 2.9 | 3.6 |
对结果进行转置
frame3.T
2000 | 2001 | 2002 | |
---|---|---|---|
Nevada | NaN | 2.4 | 2.9 |
Ohio | 1.5 | 107.0 | 3.6 |
内层的字典键会被合并、排序以形成最终的索引。如果显示指定了索引,则不会这样
DataFrame(pop,index=[2001,2002,2003])
Nevada | Ohio | |
---|---|---|
2001 | 2.4 | 107.0 |
2002 | 2.9 | 3.6 |
2003 | NaN | NaN |
pdata={'Ohio':frame3['Ohio'][:-1],'Nevada':frame3['Nevada'][:2]}
DataFrame(pdata)
Nevada | Ohio | |
---|---|---|
2000 | NaN | 1.5 |
2001 | 2.4 | 107.0 |
下表列出了DataFrame构造函数所能接受的各种数据
如果设置了DataFrame的index和columns的name属性,则这些信息也会被显示出来
frame3.index.name='year';frame3.columns.name='state'
frame3
state | Nevada | Ohio |
---|---|---|
year | ||
2000 | NaN | 1.5 |
2001 | 2.4 | 107.0 |
2002 | 2.9 | 3.6 |
跟Series一样,values属性也会以二维ndarry的形式返回DataFrame中的数据
frame3.values
array([[ nan, 1.5],
[ 2.4, 107. ],
[ 2.9, 3.6]])
如果DataFrame各列的数据类型不同,则值数组的数据类型就会选用能兼容所有列的数
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)
索引对象:padas对象负责管理轴标签和其他元数据(比如轴名称等)。 构建Series和DataFrame时,所用到的任何数组或其他序列的标签会被转换成一个index
obj=Series(range(3),index=['a','b','c'])
index=obj.index
index
Index(['a', 'b', 'c'], dtype='object')
index[1:]
Index(['b', 'c'], dtype='object')
index对象是不可以修改的(immutable),因此用户不能对其进行修改
index[1]='d'
—————————————————————————
TypeError Traceback (most recent call last)
<ipython-input-49-8be6e68dba2d> in <module>()
----> 1 index[1]='d'
e:\python\lib\site-packages\pandas\core\indexes\base.py in __setitem__(self, key, value)
1722
1723 def __setitem__(self, key, value):
-> 1724 raise TypeError("Index does not support mutable operations")
1725
1726 def __getitem__(self, key):
TypeError: Index does not support mutable operations
index不可修改的重要性,这样才能使得index对象在多个数据结构之间安全共享
index=pd.Index(np.arange(3))
obj2=Series([1.5,-2.5,0],index=index)
obj2.index is index
True
下表列出了pandas库内置的index类
frame3
Nevada | Ohio | |
---|---|---|
2000 | NaN | 1.5 |
2001 | 2.4 | 107.0 |
2002 | 2.9 | 3.6 |
'Ohio' in frame3.columns
True
2003 in frame3.index
False
每个索引都一些方法和属性,可用于设置逻辑并回答有关该索引所包含的数据的常见的问题