数据结构介绍
名称 | 说明 |
---|---|
Series | 一维带标签的同种数据类型的数组 |
DataFrame | 二维带标签的大小可变的各列数据类型可以不同的二维表格 |
Panel | 三维带标签大小可变的数组 |
可以把DataFrame看作Series的容器,把Panel看作是DataFrame的容器
序列
Series的生成方式是多种多样的,可以用numpy去生成一个序列
>>> s = pd.Series(np.random.rand(5))
0 0.350976
1 0.735377
2 0.330421
3 0.466046
4 0.749564
dtype: float64
打印出来的序列,左边是标签,右边是值。默认情况下索引从0开始。可以用Index和values属性得到索引和数据。
>>> s.index
RangeIndex(start=0, stop=5, step=1)
>>> s.values
array([0.35097618, 0.73537748, 0.33042106, 0.46604558, 0.74956398])
可以在创建序列的时候同时声明索引(支持重复索引)
>>> s = pd.Series(np.random.rand(5), index=['a','b','c','d','a'])
a 0.694635
b 0.068107
c 0.302411
d 0.044751
a 0.858449
dtype: float64
也可以使用字典生成,没有指定索引值的情况下,默认采用关键字作为索引值
>>> b = {
'a':1, 'b':5, 'c':8}
>>> pd.Series(b)
a 1
b 5
c 8
dtype: int64
也可以定义索引值
>>> pd.Series(b, index={
'a', 'b', 'c', 'd'})
c 8.0
b 5.0
d NaN
a 1.0
dtype: float64
(为啥会乱序……)最好index和数据,长度一样,可以看到不一样使用nan填充,但是会出现一些问题。
如果是纯量,设置好索引会自动填充到索引大小一致
>>> pd.Series(1, index=['a','b','c','d','r'])
a 1
b 1
c 1
d 1
r 1
dtype: int64
可以使用索引值来检索数据
>>> s['a']
a 0.694635
a 0.858449
dtype: float64
>>> s[['a','d']]
a 0.694635
a 0.858449
d 0.044751
dtype: float64
序列和数组很相似,也可以用切片和布尔值运算进行操作
>>> s[s>0.5]
a 0.694635
a 0.858449
dtype: float64
>>> s[1:3]
b 0.068107
c 0.302411
dtype: float64
序列和数组的一个不同是:不通过序列间进行运算,相同索引会自动对齐并进行运算,拥有name属性,可以给序列标名字
>>> test=pd.Series(np.arange(5), index=['a','b','c','d','e'], name='hh')
>>> test
a 0
b 1
c 2
d 3
e 4
Name: hh, dtype: int32
>>> test[1:]+test[:-1]
a NaN
b 2.0
c 4.0
d 6.0
e NaN
Name: hh, dtype: float64
>>> test.name
'hh'
数据框
DataFrame是二维带标签的各列数据类型可以不同的数据结构。生成数据框的时候,可以定义行标签、列标签,注意匹配关系。
比较常用的是使用python的字典结构来生成数据框
>>> data = {
'城市':['北京','上海','深圳','成都','杭州'], '人口/千万':[2171,2415,1191,1591.8,901.3]}
>>> frame = DataFrame(data)
城市 人口/千万
0 北京 2171.0
1 上海 2415.0
2 深圳 1191.0
3 成都 1591.8
4 杭州 901.3
这里没有定义行标签,pandas会自动生成行标签,排序后的字典的键会成为列标签。
也可以通过columns设置各参数的先后顺序
>>> pd.DataFrame(data, columns=['人口/千万', '城市'])
人口/千万 城市
0 2171.0 北京
1 2415.0 上海
2 1191.0 深圳
3 1591.8 成都
4 901.3 杭州
同理,可以使用index设置行标签
定义列标签时,如果数据不存在,会显示NaN
也可以字典内嵌套序列来生成。不在赘述。
有两种取列的方式:
>>> frame.城市
0 北京
1 上海
2 深圳
3 成都
4 杭州
Name: 城市, dtype: object
>>> data['人口/千万']
0 2171.0
1 2415.0
2 1191.0
3 1591.8
4 901.3
Name: 人口/千万, dtype: float64
-
loc函数
loc函数里的参数是数据框的行标签,返回一个序列。对行进行分片的时候返回一个数据框,也可以使用bool进行索引。对数据框的操作语法和字典是类似的
>>> frame.loc[0] 城市 北京 人口/千万 2171 Name: 0, dtype: object >>> frame.pop('城市') 0 北京 1 上海 2 深圳 3 成都 4 杭州 Name: 城市, dtype: object
此时数据被删除
>>> frame 人口/千万 0 2171.0 1 2415.0 2 1191.0 3 1591.8 4 901.3
也可以使用del去删除某列,语法是:
del frame['城市']
默认情况下,Insert会插入数据框的末尾,也可以设定插入位置
>>> frame.insert(0,'年份',pd.Series([2015,2015,2016,2007,2009])) 年份 人口/千万 0 2015 2171.0 1 2015 2415.0 2 2016 1191.0 3 2007 1591.8 4 2009 901.3
弹出、删除、插入操作都是对原数据进行修改。选择行列的时候都是对原数据的指代,不会复制原数据
也可以使用嵌套的字典来生成df
>>> data = {
'北京':{
'年份':2015,'人口':'2171'}}
>>> pd.DataFrame(data)
北京
人口 2171
年份 2015
T可以转置数据框
>>> pd.DataFrame(data).T
人口 年份
北京 2171 2015