pandas是python数据分析处理中非常常用且十分重要的第三方库,该库主要有两种数据结构:Series和DataFrame,相信很多学python的人都用过pandas.readcsv(filepath)去读取csv文件,然后就是对读取完的数据对象一顿操作,但是我在使用该函数读文件时没有考虑过这个操作很像字典的对象到底是什么东西。其实读取文件产生的对象就是DataFrame结构,这种结构的访问机制和字典很像,但要说DataFrame,还要先从基本的Series说起。
Series是一种类似一维数组的对象,它是由一组数据及与这组数据相关的数据标签(索引组成)组成,比如,可以用一个一位数组生成Series对象。
import pandas as pd
series = pd.Series([1,2,3,4])
series
[Out]
0 1
1 2
2 3
3 4
dtype: int64
从上面可以看出,生成的Series打印效果是左边是一维数组的索引,右边是一位数组对应的值。这是因为我们没有给这个series指定索引,例如,我们给它指定索引为[‘a’,‘b’,‘c’,‘d’]。
series.index=['a','b','c','d']
series
[OUT]:
a 1
b 2
c 3
d 4
dtype: int64
除了能指定数组和索引的方式生成Series对象,还可以通过传入一个简单的字典构造出series对象:
dic = {'aa':1,'bb':2,'cc':3,'dd':4}
series = pd.Series(dic)
series
[out]
aa 1
bb 2
cc 3
dd 4
dtype: int64
拥有的series后,可以通过series.values方法获取series的值,通过series.index获取series的索引。
#获取Series的值列表
Series_values = series.values
print('Series_values: ',Series_values)
#获取Series的索引列表
Series_index = series.index
print('Series_index: ',Series_index)
[out]:
Series_values: [1 2 3 4]
Series_index: Index(['aa', 'bb', 'cc', 'dd'], dtype='object')
Series就是这样一种和一维数组很像,但是又比数组的范围要广一些,它的索引可以是任意类型,这是和数组最大的区别。
说完Series结构,下面说说DataFrame结构,这是一种很常见的结构,当我们用pandas.read_csv或者pandas.read_xls等方法时返回的对象就是DataFrame结构的,这种结构好在哪?它相对于传统的矩阵来说,行索引和列索引都可以是任意类型,这就像series和一位数组一样,使得DataFrame就像是一张移动的表格,还是一张可以由代码操作的表格。
首先看看Dataframe结构的生成
#1矩阵和索引,构造Dataframe
print('矩阵和索引,构造Dataframe')
dataframe = pd.DataFrame([[1,2,3],[4,5,6]],columns = ['summer1','summer2','summer3'],index=['a','b'])
print(dataframe)
#2字典嵌套
print('字典嵌套, 构造Dataframe')
dics = {'summer1':{'a':1,'b':4},'summer2':{'a':2,'b':5},'summer3':{'a':3,'b':5}}
dataframe = pd.DataFrame(dics)
print(dataframe)
[out]:
矩阵和索引,构造Dataframe
summer1 summer2 summer3
a 1 2 3
b 4 5 6
字典嵌套, 构造Dataframe
summer1 summer2 summer3
a 1 2 3
b 4 5 5
不难看出,Dataframe的行索引是index,列索引是columns,对于字典嵌套型的产生方法来说,外层的键值是作为Dataframe的列索引,内层的键值才是行索引这是需要注意的。
#DataFrame结构的一些操作
#获取Dataframe的所有值
data_values = dataframe.values
print(data_values)
[out]
[[1 2 3]
[4 5 5]]
#获取Dataframe的所有索引
data_index = dataframe.index
print(data_index)
[out]
Index(['a', 'b'], dtype='object')
#获取Dataframe的某一列
data_column = dataframe['summer1']
print(data_column)
[out]
a 1
b 4
Name: summer1, dtype: int64
#获取某一列的值
data_column_values = dataframe['summer1'].values
print(data_column_values)
[out]
[1 4]
#获取某一列的索引
data_column_index = dataframe['summer1'].index
print(data_column_index)
[out]
Index(['a', 'b'], dtype='object')
#获取dataframe某一行
data_ind = dataframe.loc['a']
print(data_ind)
[out]
summer1 1
summer2 2
summer3 3
Name: a, dtype: int64
#获取某一行的值
data_ind_values = dataframe.loc['a'].values
print(data_ind_values)
[out]
[1 2 3]
#获取某一行的索引
data_ind_index = dataframe.loc['a'].index
print(data_ind_index)
[out]
Index(['summer1', 'summer2', 'summer3'], dtype='object')
从上述代码中可以分析出,Dataframe结构相当于一个二维的series结构,dataframe的每一行或者每一列单独拿出来都是一个series结构,都可以使用series结构的成员方法。
值得注意的是,按列取出的series结构的索引和Datafram结构的行索引相同,按行取出的series结构的索引和Dataframe结构的列索引相同。
在平常读取csv文件时,常常操作的是列属性,也就是columns,所以取列属性时直接使用变量名[‘属性名’]即可。因此为了区别列索引,取行索引时需要用loc关键字。
以上就是对pandas两种数据结构的浅析,如有错误,欢迎大家留言讨论。