pandas的常用工具数据结构:Series和DataFrame
1 Series介绍
Series 是一维的数组型对象,它包含了一个值序列和数据标签(称为索引),最简单的序列由一个数组形成,可理解维是一个长度固定且有序的字典
基本使用
obj = pd.Series([4, 7, -5, 3])
obj
obj.values #获取值
obj.index #获取索引范围,默认索引从0至N-1
obj2 = pd.Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c']) #指定索引值(类似map)
obj2
obj2.index
obj2['a']
obj2['d'] = 6 #特定索引修改值
obj2[['c', 'a', 'd']] #据索引取值
obj2[obj2 > 0] #判断值范围,过滤
obj2 * 2 #乘积
np.exp(obj2)
'b' in obj2 #判断某值是否在数组
'e' in obj2
sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
obj3 = pd.Series(sdata) #返回对应的数组
obj3
states = ['California', 'Ohio', 'Oregon', 'Texas']
obj4 = pd.Series(sdata, index=states) #将数组的索引替代,且经过了排序
obj4
pd.isnull(obj4) #判断数组值中是否有NaN的,返回布尔数组 (NaN为缺失数据)
等同于
obj4.isnull()
pd.notnull(obj4) #判断数组值中是否没有NaN的,返回布尔数组
obj3
obj4
obj3 + obj4 #同key的累加,其中有一数组的无对应key,则返回空;与join操作相似
obj4.name = 'population' #添加数组的name属性
obj4.index.name = 'state' #添加数组索引的name属性
obj4
2 DataFrame介绍
DataFrame 表示的是矩阵的数据表,包含了已排序的列集合,每一列可以是不同的数据类型(数值、字符串、布尔值等),DataFrame既有行索引也有列索引,可视为一个共享相同索引的Series的字典。在DataFrame中,数据被存储为一个以上的二维块,而不是列表、字典或其他一维数组的集合
注意:从dataframe中选取的列是数据的视图,而不是拷贝,因此,对series的修改会映射到dataframe中,如需复制,则应当显式地使用series的copy方法
2.1 基本使用
最常用的构建方式是利用包含等长度列表或numpy数组的字典来形成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) #定义dataframe的数据,会自动分配索引,并排序
frame
frame.head() #获取数据表的头部的5行
pd.DataFrame(data, columns=['year', 'state', 'pop']) #按照指定列的排序
2.2 基于行列操作
frame2 = pd.DataFrame(data, columns=['year', 'state', 'pop', 'debt'],index=['one', 'two', 'three', 'four','five', 'six']) #指定源数据data,指定列名顺序,指定行索引,且指定的列名不存在,则会补充缺失值
frame2
frame2.columns #获取列名
frame2['state'] #取对应列的值 方法1(任意列名均有效)
frame2.year #取对应列的值 方法2(仅在是python有效变量名时有效)
frame2.loc['three'] #获取指定行
frame2['debt'] = 16.5 #指定列赋固定值
frame2
frame2['debt'] = np.arange(6.) #指定列赋范围值
frame2
val = pd.Series([-1.2, -1.5, -1.7], index=['two', 'four', 'five'])
frame2['debt'] = val #指定列,赋Series有对应索引的值
frame2
frame2['eastern'] = frame2.state == 'Ohio' #添加列,并指定对应值,赋值时长度必须一致
#注意 frame2.eastern的语法无法创建新的列
frame2
del frame2['eastern'] #删除列
frame2.columns
2.3 嵌套字典数据
pop = {'Nevada': {2001: 2.4, 2002: 2.9},'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}
frame3 = pd.DataFrame(pop) #将嵌套的字典,作为行显示
frame3
frame3.T #转置数据表
pd.DataFrame(pop, index=[2001, 2002, 2003])
2.4 截取serise的字典部分数据 形成dataframe
pdata = {'Ohio': frame3['Ohio'][:-1],'Nevada': frame3['Nevada'][:2]}
pd.DataFrame(pdata) #截取部分数据表的数据
frame3.index.name = 'year'; frame3.columns.name = 'state'#添加name属性
frame3
frame3.values #取数据表的值
frame2.values #若dataframe包含不同的数据类型,则value的dtype会自动现在合适列的类型
3 Dataframe构造函数的有效输入
(1)2D ndarray : 数据的矩阵,行和列的标签是可选参数
(2)数组、列表和元组构成的字典 : 每个序列成为dataframe的一列,所有的序列必须等长
(3)numpy结构化/记录化数组:与数组构成的字典一致
(4)series构成的字典:每个值成为一列,每个series的索引联合起来形成结果的行索引,也可显示地传递索引
(5)字典或series构成的列表:列表中的一个元素形成dataframe的一行,字典或series索引联合起来形成dataframe的列标签
(6)其他dataframe:如不显示传递索引,则会使用原索引
(7)其他的一些字典或列表或数组等
本篇知识点参考《利用python进行数据分析》,更多知识请阅读原书