说明:本blog基于python3版本, pandas 1.3.5, numpy1.22.0
前言
本文主要介绍pandas 的基础数据结构, Series和 DataFrame 及索引在两种数据结构中的作用。
一、Series 数据结构
Series是一维的数组型对象,它由两部分组成:索引(也称为数据标签,index) 和 值序列(索引所对应的数据)
【注:默认索引为从0到N-1,N代表值序列的长度】
Series比较常见的有如下五种方法:
1.1 获得索引的方法:Series类型数据.index, 返回一个Index类型对象
1.2 获得值的方法:Series类型数据.values, 返回一个ndarray类型对象
我们着重介绍一下生成Series类型数据的方法(共三种):字典法 、列表法 和 ndarray数组法
比如我们想要生成一个长度为5的Series, 这个Series的index为[0,1,2,3,4], value 为[“a”,“b”,“c”,“d”,“e”],我们使用两种方法;
使用字典法,代码如下,
import pandas as pd
import numpy as np
ser_list = ["a","b","c","d","e"]
ser_dic = {0:"a", 1:"b", 2:"c",3:"d",4:"e"}
ser_np = np.array(["a","b","c","d","e"] )
ser_list = pd.Series(ser_list)
ser_dic = pd.Series(ser_dic)
ser_np = pd.Series(ser_np, index = [0,1,2,3,4])
print(("Series data made by list is \n{}").format(ser_list))
print(("Series data made by dict is \n{}").format(ser_dic))
print(("Series data made by numpy is \n{}").format(ser_np))
结果如下,
Series data made by list is
0 a
1 b
2 c
3 d
4 e
dtype: object
Series data made by dict is
0 a
1 b
2 c
3 d
4 e
dtype: object
Series data made by numpy is
0 a
1 b
2 c
3 d
4 e
dtype: object
当然,如果我们想改变上边的索引,可以使用 Series.index = list形式的索引
比如,我想改变所有位置索引为 [“aa”,“bb”,“vv”,“cc”,“qq”]
我可以使用如下方法:
【注意:使用index方法直接赋值改变索引时,新的索引值个数必须与原Series的索引值个数相等!!!否则,报错】
ser_list.index = ["aa","bb","vv","cc","qq"]
print(ser_list)
结果如下,
aa a
bb b
vv c
cc d
qq e
dtype: object
二、DataFrame 数据结构
DataFrame是二维的数组型对象,它由两部分组成:索引(包括行索引和列索引) 和 值序列(索引所对应的数据),DataFrame是按列形成的,不同列的值的数据类型可以不同
生成DataFrame类型数据与Series相同,主要有三种方法:等长字典法,等长列表法,二维ndarray数组法
比如, 我们想生成一个行索引为 [0,1,2,3,4],列索引为 [“11”,“22”]的二维数组,分别使用三种方法实现
代码如下,
import pandas as pd
import numpy as np
DF_list = [["a1","a2"],["b1","b2"],["c1","c2"],["d1", "d2"],["e1","e2"]]
DF_dic = {"11":["a1","b1","c1","d1","e1"], "22":["a2","b2","c2","d2","e2"]}
DF_np = np.array([["a1","a2"],["b1","b2"],["c1","c2"],["d1", "d2"],["e1","e2"]])
DF_list = pd.DataFrame(DF_list, columns = ["11","22"], index = [0,1,2,3,4])
DF_dic = pd.DataFrame(DF_dic)
DF_np = pd.DataFrame(DF_np, columns = ["11","22"])
print(("DataFrame data made by list is \n{}").format(DF_list))
print(("DataFrame data made by dict is \n{}").format(DF_dic))
print(("DataFrame data made by numpy is \n{}").format(DF_np))
结果如下,
DataFrame data made by list is
11 22
0 a1 a2
1 b1 b2
2 c1 c2
3 d1 d2
4 e1 e2
DataFrame data made by dict is
11 22
0 a1 a2
1 b1 b2
2 c1 c2
3 d1 d2
4 e1 e2
DataFrame data made by numpy is
11 22
0 a1 a2
1 b1 b2
2 c1 c2
3 d1 d2
4 e1 e2
【注:使用等长字典法时,可以使用两层字典嵌套的形式;外层字典键值对应列索引,内层字典键值对应行索引】
我们也可以调整各列的顺序,
比如把上边的DF_list的11 和 22换位,再增加一个33列
DF_list = pd.DataFrame(DF_list, columns = ["22","11","33"])
结果如下,
22 11 33
0 a2 a1 NaN
1 b2 b1 NaN
2 c2 c1 NaN
3 d2 d1 NaN
4 e2 e1 NaN
由此可见,22列和11列对换了顺序,同时因为33列没有值,我们用Nan值填充。
另外,我们还可以取出11列,形成一个新的Series数据
取列,与Series类型数据相同,DataFrame类型数据[“列索引”]
【注:取出的列是DataFrame的“视图”,不是copy】
DF_22 = DF_list["22"]
print(DF_22)
结果如下,
0 a2
1 b2
2 c2
3 d2
4 e2
Name: 22, dtype: object
取行,DataFrame类型数据.loc[“行索引”]
比如取行索引为2的数据,返回一个Series类型数据
DF_2 = DF_list.loc[2]
print(DF_2)
结果如下,
11 c1
22 c2
Name: 2, dtype: object
修改列值,DataFrame类型数据[“列索引”] = 标量值/数组
【注:如果是数组,那么数组长度必须与列长度相等,否则报错!!!】
比如修改33列的值为 [“h”,1,“p”,“z”,“o”]
DF_list["33"] = ["h",1,"p","z","o"]
print(DF_list)
结果如下,
22 11 33
0 a2 a1 h
1 b2 b1 1
2 c2 c1 p
3 d2 d1 z
4 e2 e1 o
三、索引对象的不可更改性
索引对象的不可更改性是指对索引对象某个元素的直接更改是不可以的,但是可以对整体索引进行二次赋值!!!
总结
写在最后,学pandas请关注Efred.D