Pandas 是python的一个数据分析包。 Pandas的名称来自于面板数据(panel data)和python数据分析(data analysis)。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。Pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
数据结构
在Pandas中有两类非常重要的数据结构,即序列Series和数据框DataFrame:
Series类似于numpy中的一维数组,除了通吃一维数组可用的函数或方法,而且其可通过索引标签的方式获取数据,还具有索引的自动对齐功能;
DataFrame类似于numpy中的二维数组,同样可以通用numpy数组的函数和方法,而且还具有其他灵活应用。
例行地导入:
import pandas as pd
from pandas import Series, DataFrame
序列(Series)
series是一个像数组一样的一维序列,并伴有一个数组表示下标,叫做index。
还可以把它看作一个长度固定,有顺序的dict,从index映射到value。在很多场景下,可以当做dict来用。
创建序列
使用pd.Series函数
- 用列表
obj = pd.Series([4,7,-5,3]) #不指定下标
obj
0 4
1 7
2 -5
3 3
dtype: int64
- 指定下标
obj2 = pd.Series([4, 7, -5, 3], index=['d','b','a','c']) #指定下标
obj2
d 4
b 7
a -5
c 3
dtype: int64
- 用字典
sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon':16000, 'Utah': 5000}
obj3 = pd.Series(sdata)
obj3
Ohio 35000
Texas 71000
Oregon 16000
Utah 5000
dtype: int64
索引
Series的左边为index,右边为对应的value
obj.values
array([ 4, 7, -5, 3], dtype=int64)
obj2.index
Index(['d', 'b', 'a', 'c'], dtype='object')
在序列中,index可以被视作索引;
即可以通过 obj2[‘d’] 的方法调用value,也可以类似numpy中用布尔值作索引,如 obj2[obj2>0]
但是注意index object是不可更改的
缺失数据、数据合并
isnull()和notnull()可以判断数据是否缺失:
obj.isnull()
pd.isnull(obj)
#两种使用方式
将两个序列用+连接可得到其合并的结果:
states = ['California', 'Ohio', 'Oregon', 'Texas']
obj4 = pd.Series(sdata, index=states)
obj3+obj4
California NaN
Ohio 70000.0
Oregon 32000.0
Texas 142000.0
Utah NaN
dtype: float64
name属性
series自身和它的index都有一个叫name的属性,这个能和其他pandas的函数进行整合
obj4.name = 'population'
obj4.index.name = 'state'
obj4
state
California NaN
Ohio 35000.0
Oregon 16000.0
Texas 71000.0
Name: population, dtype: float64
数据框(DataFrame)
DataFrame表示一个长方形表格,并包含排好序的列,每一列都可以是不同的数值类型(数字,字符串,布尔值)。
DataFrame有行索引和列索引(row index, column index);可以看做是分享所有索引的由series组成的字典。数据是保存在一维以上的区块里的。
创建数据框
创建dataframe以字典为对象,字典内的值需为列表:
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002, 2003],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
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
5 Nevada 2003 3.2
使用pd.DataFrame函数时可以指定列名和index的顺序,但是如果导入一个不存在的列名,那么会显示为缺失数据:如:
frame2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'],
index=['one', 'two', 'three', 'four', 'five', 'six'])
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
six 2003 Nevada 3.2 NaN
元素为字典的字典
对于这类字典:pandas会把外层dict的key当做列,内层key当做行索引
pop = {'Nevada': {2001: 2.4, 2002: 2.9},
'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}
行列操作
从DataFrame里提取一列的话会返回series格式,如frame[‘state’]。frame[column]能应对任何列名,但frame.column的情况下,列名必须是有效的python变量名才行。
从DataFrame里提取一行要用在loc属性里用 位置或名字,如:frame2.loc[‘three’]。
对行或列可以赋值,如果赋值为单个数字则是给所有列(行)赋同一个值;如果是list或array,长度必须符合数据框的长度
- 创建新列
可以通过赋值创建新列,如:直接添加一个新的列名(‘eastern’)
frame2['eastern'] = frame2.state == 'Ohio'
#动态增加列,注意=后面的是一个逻辑表达式,所以赋值是TRUE|FALSE
- 删除列
del frame2['eastern']
- 创建新行
两种方法,分别使用append和loc属性,注意append只是创建视图,若要改动原数据框,需要进行赋值;loc属性的变动是在原数据框上
#方案一
temp={"state":'WashingtonDC',"year":2005,"pop":5,"debt":NaN}
frame2=fame2.append(temp,ignore_index=True)
#方案二
frame2.loc[len(frame2)]=['WashingtonDC',2005,5.4,NaN]
- 删除行(比如删除最后一行)
mydata.drop([len(mydata)-1],inplace=True)
#inplace指在原数据框上改动
- 转置
frame2.T
- 指定索引
pd.DataFrame(pop, index=[2001, 2002, 2003])
#将索引从2000,2001,2002改为了2001,2002,2003
数据框与numpy转换
- df.values 可以返回一个包含DataFrame基础数据的numpy数组,不带任何索引或列名。
- pd.DataFrame () 方法将 NumPy 数组转换为 Pandas DataFrame。
索引对象
- pandas的Index Objects (索引对象)负责保存axis labels和其他一些数据(比如axis name或names)。一个数组或其他一个序列标签,只要被用来做构建series或DataFrame,就会被自动转变为index。
- index object是不可更改的,所以data structure中分享index object是很安全的
- 与python里的set不同,pandas的index可以有重复的labels,在这种重复的标签中选择的话,会选中所有相同的标签