之前介绍的Numpy适合处理同质型的数值类数组数据,而pandas是用来处理表格型或者异质性数据。这篇博文主要是来简要介绍pandas的两个常用的工具数据结构:Series和DataFrame。
Series
- Series是一维的数组型对象,包含一个值序列,并且包含了数组标签,称为索引。
- 可以被认为是一个长度固定且有序的字典。
- pandas中标记缺失值或NA值的方式:NAN
首先介绍生成Series的三种常用方式:
import pandas as pd
from pandas import Series,DataFrame
import numpy as np
#默认生成的索引是从0到N-1(N是数据的长度)
obj1 = pd.Series([4,5,6,7])
obj1
#index是索引序列
obj2 = pd.Series([4,5,-6,-7],index=["a","b","c","d"])
obj2
#可以使用字典生成Series
data = {"tom":11,"sam":20,"beryl":13,"daniel":14,"shally":23}
obj3 = pd.Series(data)
obj3
Out:
0 4
1 5
2 6
3 7
dtype: int64
a 4
b 5
c -6
d -7
dtype: int64
tom 11
sam 20
beryl 13
daniel 14
shally 23
dtype: int64
然后,来介绍Series的几个属性
#获得Series对象的值和索引
obj1.values
obj1.index
#Series对象自身和其索引都有name属性
obj3.name = "People"
obj3.index.name = "NAME"
obj3
Out:
array([4, 5, 6, 7], dtype=int64)
RangeIndex(start=0, stop=4, step=1)
NAME
tom 11
sam 20
beryl 13
daniel 14
shally 23
Name: People, dtype: int64
最后,来介绍Series一个非常有用的特性:自动对齐索引
obj3
obj4
obj3 + obj4
Out:
tom 11
sam 20
beryl 13
daniel 14
shally 23
dtype: int64
beryl 13.0
daniel 14.0
d00 NaN
tom 11.0
shally 23.0
sam 20.0
dtype: float64
beryl 26.0
d00 NaN
daniel 28.0
sam 40.0
shally 46.0
tom 22.0
dtype: float64
DataFrame
DataFrame表示矩阵的数据表,每列可以是不同的值类型,被视为共享共同索引的Series的字典。
首先介绍DataFrame对象的生成
#创建DataFrame,利用包含等长度列表或Numpy数组的字典
data = {"province":["Henan","Hubei","Hunan","Guangdong","Sichuan"],
"year":[2000,2020,2030,2040,2050],
"city":["Nanyang","Wuhan","Changsha","Zhuhai","Yaan"]
}
frame = pd.DataFrame(data)
frame
Out:
province year city
0 Henan 2000 Nanyang
1 Hubei 2020 Wuhan
2 Hunan 2030 Changsha
3 Guangdong 2040 Zhuhai
4 Sichuan 2050 Yaan
#若传的列不在字典里,将会在结果中出现缺失值
frame2 = pd.DataFrame(data,columns=["city","province","year","debt"],index=["a","b","c","d","e"])
frame2
Out:
city province year debt
a Nanyang Henan 2000 NaN
b Wuhan Hubei 2020 NaN
c Changsha Hunan 2030 NaN
d Zhuhai Guangdong 2040 NaN
e Yaan Sichuan 2050 NaN
嵌套字典被赋值给DataFrame,pandas会将字典的键作为列,将内部字典的键作为行索引。
fm = {"Nanyang":{"province":"Henan","year":2000,"debt":10},
"Wuhan":{"province":"Hubei","year":2020}}
frame3 = pd.DataFrame(fm)
frame3
Out:
Nanyang Wuhan
debt 10 NaN
province Henan Hubei
year 2000 2020
然后介绍DataFrame对象的属性和方法
#只会选出头部的五行
frame.head()
#如果指定了顺序,会按照顺序进行排列
pd.DataFrame(data,columns=["city","province","year"])
Out:
province year city
0 Henan 2000 Nanyang
1 Hubei 2020 Wuhan
2 Hunan 2030 Changsha
3 Guangdong 2040 Zhuhai
4 Sichuan 2050 Yaan
city province year
0 Nanyang Henan 2000
1 Wuhan Hubei 2020
2 Changsha Hunan 2030
3 Zhuhai Guangdong 2040
4 Yaan Sichuan 2050
frame2.columns
Out:
Index(['city', 'province', 'year', 'debt'], dtype='object')
最后介绍DataFrame的索引对象。
pandas中的索引对象是用于存储轴标签和其他元数据的(例如轴名称,标签),任何数组或标签序列都可以在内部转换为索引对象。
obj = pd.Series(range(3),index=["a","b","c"])
index= obj.index
index[1:]
Out:
Index(['b', 'c'], dtype='object')
- 索引对象是不可变的,用户不可修改,所以index[1] = "e"这种代码是一定会报错的。
- 与python集合不同,pandas索引对象可以包含重复标签。
labels0 = pd.Index(["a","a","b","c"])
labels0
Out:
Index(['a', 'a', 'b', 'c'], dtype='object')
- 索引对象的属性和方法也比较多,在这里列出来一部分供大家查阅
#labels和labels0是两个索引对象
labels.append(labels0)#将新的索引对象粘贴到原索引后,产生一个的新的索引对象
labels.difference(labels0)#计算两个索引对象的差集
labels.intersection(labels0)#计算两个索引对象的交集
labels.union(labels)#计算两个索引对象的并集
labels.isin([1,2])#计算每一个值是否在传值容器中的布尔数组
labels.delete(0)#删除位置i的元素,并且产生新的索引
labels.drop(1)#根据传参删除指定索引值,并产生新的索引
labels.insert(3,4)#在位置i插入元素,并产生新的索引
labels.is_monotonic#如果索引序列递增则返回True
labels.is_unique#如果索引序列唯一则返回true
labels.unique()#计算索引的唯一值序列