目录
- 一、Pandas的数据结构介绍
- 1、Series
- 2、DataFrame
- (1)Dataframe创建
- (2)读取DataFrame的索引名和数值
- (3)读取DataFrame特定索引的值
- (4)为DataFrame对象赋值
- (5)列的删除
- 3、index对象
一、Pandas的数据结构介绍
1、Series
Series类型类似于字典类型,每组数据都有一组与之相关的数据标签(即索引)组成。
来看看最简单的Series:
from pandas import Series, DataFrame
import pandas as pd
obj = Series([4, 7, -5, 3])
obj
输出:0 4
1 7
2 -5
3 3
dtype: int64
可以看到数值左边都有一列索引。一个Series对象有一列index值和一列values值。
obj.values
输出:array([ 4, 7, -5, 3])
obj.index
输出:RangeIndex(start=0, stop=4, step=1)
索引值也是可以自定义的。
obj2 = Series([4, 7, -5, 3], index = ['d', 'b', 'a', 'c'])
obj2
输出:d 4
b 7
a -5
c 3
dtype: int64
obj2['a']
输出:-5
obj2[['c', 'a', 'd']]
输出:c 3
a -5
d 4
dtype: int64
对Series对象进行运算,也会保留其索引值。
obj2[obj2 > 0]
输出:d 4
b 7
c 3
dtype: int64
obj2 * 2
输出:d 8
b 14
a -10
c 6
dtype: int64
import numpy as np
np.exp(obj2)
输出:d 54.598150
b 1096.633158
a 0.006738
c 20.085537
dtype: float64
Series与字典。Series对象可以像字典对象一样,可以用在许多原本需要字典参数的函数中。也可以通过字典类型来创建Series类型。
'b' in obj2
输出:'b' in obj2
sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
obj3 = Series(sdata)
obj3
输出:Ohio 35000
Texas 71000
Oregon 16000
Utah 5000
dtype: int64
如果只传入一个字典,则结果Series的索引就是原字典的键。
states = ['California', 'Ohio', 'Oregon', 'Texas']
obj4 = Series(sdata, index = states)
obj4
输出:California NaN
Ohio 35000.0
Oregon 16000.0
Texas 71000.0
dtype: float64
Series对象有name属性及index.name属性
obj4.name = 'population'
obj4.index.name = 'state'
obj4
输出:state
California NaN
Ohio 35000.0
Oregon 16000.0
Texas 71000.0
Name: population, dtype: float64
2、DataFrame
DataFrame类型可以简单理解为有行索引及列索引的数据类型,也可以理解为带索引的Series。从创建开始说起。
(1)Dataframe创建
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
输出: 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
可以看到在创建DataFrame时,自动为数据增加了行索引,0~4。
可以在创建DataFrame时规定列的顺序。
DataFrame(data, columns = ['year', 'state', 'pop'])
输出: 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
也可以自定义行索引的值。
frame2 = DataFrame(data, columns = ['year', 'state', 'pop', 'debt'], index = ['one', 'two', 'three', 'four', 'five'])
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
另一种创建方式是通过嵌套字典。
pop = {'Nevada': {2001: 2.4, 2002: 2.9}, 'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}
frame3 = DataFrame(pop)
frame3
输出: Nevada Ohio
2000 NaN 1.5
2001 2.4 1.7
2002 2.9 3.6
(2)读取DataFrame的索引名和数值
可以通过DataFrame.columns读取DataFrame的列索引名。
frame2.columns
输出:Index(['year', 'state', 'pop', 'debt'], dtype='object')
可以通过DataFrame.index读取DataFrame的行索引名。
frame2.index
输出:Index(['one', 'two', 'three', 'four', 'five'], dtype='object')
可以通过DataFrame.values方法读取DataFrame除索引外的纯数据值。
frame2.values
输出:array([[2000, 'Ohio', 1.5, nan],
[2001, 'Ohio', 1.7, -1.2],
[2002, 'Ohio', 3.6, nan],
[2001, 'Nevada', 2.4, -1.5],
[2002, 'Nevada', 2.9, -1.7]], dtype=object)
(3)读取DataFrame特定索引的值
可以通过['索引名']或.索引名的方式读取某列的数据。
frame2['state']
输出:one Ohio
two Ohio
three Ohio
four Nevada
five Nevada
Name: state, dtype: object
frame2.year
输出:one 2000
two 2001
three 2002
four 2001
five 2002
Name: year, dtype: int64
frame2.year['one']
输出:2000
(4)为DataFrame对象赋值
可以用标量数值直接为某列数据进行赋值,或者用Series类型数据为DataFrame某几列赋值。
frame2['debt'] = 16.5
frame2
输出: year state pop debt
one 2000 Ohio 1.5 16.5
two 2001 Ohio 1.7 16.5
three 2002 Ohio 3.6 16.5
four 2001 Nevada 2.4 16.5
five 2002 Nevada 2.9 16.5
frame2['debt'] = np.arange(5.)
frame2
输出: year state pop debt
one 2000 Ohio 1.5 0.0
two 2001 Ohio 1.7 1.0
three 2002 Ohio 3.6 2.0
four 2001 Nevada 2.4 3.0
five 2002 Nevada 2.9 4.0
val = Series([-1.2, -1.5, -1.7], index = ['two', 'four', 'five'])
frame2['debt'] = val
frame2
输出: year state pop debt
one 2000 Ohio 1.5 NaN
two 2001 Ohio 1.7 -1.2
three 2002 Ohio 3.6 NaN
four 2001 Nevada 2.4 -1.5
five 2002 Nevada 2.9 -1.7
(5)列的删除
frame2['eastern'] = (frame2.state == 'Ohio')
frame2
输出: year state pop debt eastern
one 2000 Ohio 1.5 NaN True
two 2001 Ohio 1.7 -1.2 True
three 2002 Ohio 3.6 NaN True
four 2001 Nevada 2.4 -1.5 False
five 2002 Nevada 2.9 -1.7 False
del frame2['eastern']
frame2.columns
输出:Index(['year', 'state', 'pop', 'debt'], dtype='object')
3、index对象
首先来看看index对象是什么。
obj = Series(range(3), index = ['a', 'b', 'c'])
index = obj.index
index
输出:Index(['a', 'b', 'c'], dtype='object')
可见,对Series和DataFrame对象使用index方法,返回的就是一个index对象。
index是不可以被手动修改的。不可修改性非常重要,这样才能使index在多个数据结构之间安全共享。
index常用的方法有很多,可以参照如下表格。