Pandas 中的两个最重要的数据结构是 Series 和 DataFrame,其约定的引用方式为:
import pandas as pd
from pandas import Series, DataFrame
Series
Series 在 Numpy 一维数组的基础上添加了索引 index,使得其中的数据可以更加方便的通过索引进行访问和依据索引进行数据对齐 alignment。需要注意的是同数组一样,同一个Series中的数据必须是同一种数据类型。
Series 的几个常用的属性:obj.values,obj.index 用于查看其中的值和索引值。
由于构建与一维数组的基础上,因此可以沿用一维数组的切片操作:
In [2]:
np.random.seed(1)
s = pd.Series(np.random.randn(100))
s[2: 6]
Out[2]:
2 -0.528172
3 -1.072969
4 0.865408
5 -2.301539
dtype: float64
在创建 Series 时如果不指定 index,则会默认的分配从 0 开始的整数值作为索引值,称为索引值也就意味着可以通过 index 索引到相应位置的值:
In [3]:
obj = Series([4, 7, -5, 3], index=['d', 'a', 'b', 'c'])
obj
Out[3]:
d 4
a 7
b -5
c 3
dtype: int64
In [4]:
obj['b']
Out[4]:
-5
还通过索引赋值以及取多个值:
In [5]:
obj['d'] = 8
obj[['d', 'c', 'a']]
Out[5]:
d 8
c 3
a 7
dtype: int64
并支持类似 Numpy 数组的逻辑选取:
In [6]:
obj[obj > 2]
Out[6]:
d 8
a 7
c 3
dtype: int64
由于 Numpy 和 Pandas 在数据分析中使用的非常广泛,因此二者的兼容性非常好,可以直接采用 Numpy 中的很多方法来操作 Series:
In [7]:
np.exp(obj)
Out[7]:
d 2980.957987
a 1096.633158
b 0.006738
c 20.085537
dtype: float64
这个索引和值的关联关系反应到基本的 python 数据结构就是其可以与字典的键和值的关系对应起来,因此可以直接通过字典来创建 Series,且创建好的 Series 会自动的根据字典的键来排序:
In [8]:
states = {'ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
obj = Series(states)
obj
Out[8]:
Oregon 16000
Texas 71000
Utah 5000
ohio 35000
dtype: int64
也可以用很多适用于字典的函数来查询 Series:
In [9]:
'Utah' in obj
Out[9]:
True
除了索引外,Series 本身及索引本身都可以通过 name 属性来指定名称,这样做的意义是为了更好的利用已有的数据来生成 Series,以及在使用中方便的标识不同的 Series 中包含的特征信息是什么:
In [10]:
obj.name = 'population'
obj.index.name = 'state'
obj
Out[10]:
state
Oregon 16000
Texas 71000
Utah 5000
ohio 35000
Name: population, dtype: int64
创建好的索引值可以借助 index 属性通过赋值的方式来修改:
In [11]:
obj.index = ['OR', 'TX', 'UT', 'OH']
obj
Out[11]:
OR 16000
TX 71000
UT 5000
OH 35000
Name: population, dtype: int64
注意这里修改 index 后,原来的 index 的名称没有了。
对齐的一个简单的例子就是当两个 Series 做数学运算的时候,计算会发生在索引相同的项之间,而不是位置相同的项,并且不要求两个 Series 一定长度相同。
In [13]:
s3 = pd.Series([1, 2, 3], index=['d', 'c', 'b'])
s2 = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
s2 + s3
Out[13]:
a NaN
b 5.0
c 5.0
d 5.0
dtype: float64
与此对应的array的运算则是按照位置来进行,且二者的长度必须相同
DataFrame
在 Series 的基础上,DataFrame 则又可以看作是通过赋予 Series 一个名称,然后将多个 Series 进行组合操作的数据表:表的行标签是索引名,列标签是 Series 名,也称列名。
当通过字典创建 DataFrame时,列名会自动按照字母顺序进行排列:
In [14]:
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
Out[14]:
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
但也可以在创建时指定列标签的顺序:
In [15]:
DataFrame(data, columns=['year', 'state', 'pop'])
Out[15]:
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
DataFrame 设置列标签和行标签的一个重要作用就是可以通过标签来访问相应的列或行:
In [3]:
frame['state']
Out[3]:
0 Ohio
1 Ohio
2 Ohio
3 Nevada
4 Nevada
Name: state, dtype: object
In [5]:
frame.loc[3]
Out[5]:
pop 2.4
state Nevada
year 2001
Name: 3, dtype: object
另一个比较常用的创建 DataFrame 的数据来源是嵌套的字典,此时嵌套的最外层的键将作为列标签,而内层的键将作为行标签:
In [6]:
pop = {'Nevada': {2001: 2.4, 2002: 2.9}, 'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}
frame = DataFrame(pop)
frame
Out[6]:
Nevada Ohio
2000 NaN 1.5
2001 2.4 1.7
2002 2.9 3.6
DataFrame 同时也可以做转置操作
In [7]:
frame.T
Out[7]:
2000 2001 2002
Nevada NaN 2.4 2.9
Ohio 1.5 1.7 3.6
Pandas 文件读写
读入 CSV:pd.read_csv('directory_to_the_file/filename.csv')
网友评论