pandas提供Series和DataFrame作为数组数据的存储框架,数据进入这两种框架后,我们就可以利用它们提供的强大处理方法进行处理。
名称 | 维度 | 数据 |
Series | 1 | 带标签的一维同构数组 |
DataFrame | 2 | 带标签的、大小可变的二维异构表格 |
pandas曾经至此的三维面板(Panel)结构现已不再支持,可以使用多层索引形式来实现。
Series(系列、数列、序列)是一个带有标签的一维数组,这一系列的连续数据代表了一定的业务意义,如一下各国2019年的GPD就是一个典型的Series:
中国 14.34
美国 21.43
日本 5.08
dtype: float64
其中国家是标签(索引),不是具体的数据,它起到解释、定位数据的作用。如果没有标签而仅有一个数字,是不具有业务意义的。Series是pandas最基础的数据结构。
DataFrame意为数据框,是pandas定义的一个二维数据结构,它就像一个存放数据的架子,有多行多列,每个数据在一个格子里,每个格子有自己的编号。
在DataFrame结构中,横向的称作行(row)一般所说的一条数据就是指其中的一行,纵向的称作列(column)或者字段,是一条数据的某个值。
DataFrame第一行是表头,或者叫字段名,类似于Python字典里的键,代表数据的属性。
第一列是索引,就是这行数据所描述的主题,也是这条数据的关键。
在一些场景下,表头和索引也称为列索引和行索引,行索引和列索引可能会出现多层索引的情况。
给前面的国家GDP Series数据中增加一列“人口”,形成一个DataFrame:
人口 GDP
中国 13.97 14.34
美国 3.28 21.43
日本 1.26 5.08
这就是一个典型的DataFrame结构,其中有3行2列(不包含索引)数据,国家所在的列是这个表的索引每一行数据的主体为这个国家,每条数据(横向)有2个值,分别是人口和GDP。
在后续的内容中,在不同场景下可能会对索引使用以下名称:
- 索引(index):行和列上的标签,标识二维数据坐标的行索引和列索引,在默认情况下,指的是每一行的索引。如果是Series,那只能是它行上的索引。列索引又被称为字段名、表头。
- 自然索引、数字索引:行和列的0~n(n为数据长度-1)形式的索引,数据天然具有索引形式。虽然可以指定为其他名称,但在有些方法中依然可以使用。
- 标签(label):行索引和列索引,如果是Series,那只能是它行上的索引,
- 轴(axis):仅在DataFrame结构中,代表数据的方向,如行和列,用0代表列(默认),1代表行。
2.pandas生成数据
我们处理的数据基本上是pandas的DataFrame和Series,其中DataFrame是Series的容器。
在实际业务中一般不需要我们来生成数据,而是有已经采集好的数据集,直接加载到DataFrame即可。
导入pandas
想要在Python中使用pandas,需要安装库并import,约定俗成取名pd:
import pandas as pd
如果出现类似ModuleNotFoundError: No module named ‘pandas’的错误,说明没有安装Pandas模块
创建数据
使用Pd.DataFrame可以创建一个DataFrame,然后用df作为变量赋值给它,df也是约定俗成的变量名。
df=pd.DataFrame({
'国家':['中国','美国','意大利'],
'位置':['亚洲','美洲','欧洲']
})
#df(系统自动添加了索引值):
国家 位置
0 中国 亚洲
1 美国 美洲
2 意大利 欧洲
DataFrame可以容纳Series,所以在定义DataFrame时可以使用Series,也可以利用Numpy的方法,需要注意的是,生成的结果数量与行数要对应:
import pandas as pd
import numpy as np
df=pd.DataFrame({
'A':1.,
'Timestamp':pd.Timestamp('20220222'),
'C':pd.Series(1,index=list(range(3)),dtype='float32'),
'D':np.array([3]*3,dtype='int32'),
'E':pd.Categorical(['T1','T2','T3']),
'F':'foo'
})
print(df)
#df输出结果
A Timestamp C D E F
0 1.0 2022-02-22 1.0 3 T1 foo
1 1.0 2022-02-22 1.0 3 T2 foo
2 1.0 2022-02-22 1.0 3 T3 foo
从DataFrame中选取一列就会返回一个Series,选择嘟列的话依然是返回DataFrame。
选取单列的与多列的方法如下,注意选取多列时有2个中括号:
df['列标签']
df[['列标签1','列标签2']]
单独创建一个Series:
s=pd.Series([1,2,3],name='数字')
print(s)
#输出结果
0 1
1 2
2 3
Name: 数字, dtype: int64
使用Python的type函数可以查看数据类型,
如果数据类型是Series,返回<class ‘pandas.core.series.Series’>
如果数据类型是DataFrame,返回<class ‘pandas.core.frame.DataFrame’>
生成Series
Series是一个带有标签的一维数组,这个数组可以由任何类型数据构成,包括整形、浮点、字符、Python对象等。它的轴标签被称为索引,它是Pandas最基础的数据结构。
Series的创建方式:
s=pd.Series(data,index=index)
data可以是Python对象、Numpy的ndarray、一个标量(定值,如8)。index是轴上的一个列表,必须与data的长度相同,如果没有指定,则自动从0开始。
使用Numpy的ndarray结构:
#索引为ABCDE的5个随机浮点数组成的Series
s=pd.Series(np.random.randn(5),index=['a','b','c','d','e'])
print(s.index) #查看索引
#Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
print(pd.Series(np.random.randn(5))) #未指定索引
#输出结果
0 0.078758
1 0.673252
2 0.091799
3 -0.298339
4 -0.566856
dtype: float64
通过字典创建Series
d={'a':0,'b':1,'c':2}
s=pd.Series(d)
print(s)
#输出结果
a 0
b 1
c 2
dtype: int64
#如果指定索引,则会按索引顺序,如有无法与索引对应的值,会产生缺失值
d={'a':0,'b':1,'c':2}
s=pd.Series(d,index=['a','b','c','d'])
print(s)
#输出结果
a 0.0
b 1.0
c 2.0
d NaN
dtype: float64
对于一个具体的值,如果不指定索引,则其长度为1(行数为1),指定索引,则其长度为索引的数量(行数与索引对应),每个索引的值都是它
使用标量:
s=pd.Series(2)
print(s)
#输出结果(没有指定索引所以只有一行)
0 2
dtype: int64
s=pd.Series(2,index=['a','b','c'])
print(s)
输出结果:
a 2
b 2
c 2
dtype: int64
生成DataFrame
DataFrame是二维数据结构,数据以行和列的形式排列,表达一定的数据意义。
DataFrame的形式类似于CSV、Excel和SQL的结果表,有多个数据列,由多个Series组成。
DataFrame最基本的定义格式:
df=pd.DataFrame(Data=None,index=None,columns=None)
data:具体数据,结构化或同构的ndarray、可迭代对象、字典或DataFrame
index:索引,类似数组的对象,支持解包,如果没有指定则会默认添加从 0开始的序列
columns:列索引、表头,如果为指定,系统会自动推断
通过字典生成DataFrame
可以通过字典生成DataFrame,字典中的键会被当做列标签,值一般为一个列表或者元组,如果生成时指定了索引名称,会使用指定的索引名
通过字典生成DataFrame:
d={'国家':['中国','美国','意大利'],
'区域':['亚洲','欧洲','美洲']}
df=pd.DataFrame(d,index=['a','b','c'])
print(df)
#输出结果
国家 区域
a 中国 亚洲
b 美国 欧洲
c 意大利 美洲
通过Series组成的字典,来创建DataFrame,字典中的一个键值对为一列数据,如果有位置的值缺失了,会被自动填充NaN
d={'x':pd.Series([1,2,3],index=['a','b','c']),
'y':pd.Series([1,2,3,4],index=['a','b','c','d'])}
df=pd.DataFrame(d)
print(df)
#输出结果
x y
a 1.0 1
b 2.0 2
c 3.0 3
d NaN 4
通过字典列表生成DataFrame
可以将若干个字典组成一个列表,再由列表创建DataFrame
#定义一个由字典组成的列表
d1={'x':1,'y':2}
d2={'x':3,'y':4,'z':6}
data=[d1,d2]
#通过列表生成DataFrame对象
s=pd.DataFrame(data)
print(s)
#输出结果
x y z
0 1 2 NaN
1 3 4 6.0
通过Series生成DataFrame
通过Series生成DataFrame,一个Series只会生成只有一列的DataFrame
s=pd.Series(['a','b','c'])
df=pd.DataFrame(s)
print(df)
#输出结果
0
0 a
1 b
2 c
读取字典并生成DataFrame
通过字典生成DataFrame,这里字典中每个键对应一个列表,
生成的数据表,字典的键对应列标签,字典列表中的值会被作为对应的列标签的值
d={'国家':['中国','美国','意大利'],'区域':['东亚','北美','南欧']}
df=pd.DataFrame.from_dict(d)
print(df)
#输出结果
国家 区域
0 中国 东亚
1 美国 北美
2 意大利 南欧
从列表、元组、ndarray中生成
以下示例中,列表由2个元组构成,列表中每个元组的内容都会被作为DataFrame中的一行,如果两个元组中的元素个数不匹配,比如第一个元组只有3个元素。而第二个元素由5个元素,那么数据表中缺失的位置会被填充None,数据表的行标签与列标签都是从0开始的序列值
列表=[('中国','美国','意大利'),('东亚','北美','南欧')]#列表由2个元组构成
df=pd.DataFrame.from_records(列表)
print(df)
#输出结果
0 1 2
0 中国 美国 意大利
1 东亚 北美 南欧
列内容作为一个字典
列内容为一个字典
# 列内容为一个字典
pd.json_normalize(df.col)
df.col.apply(pd.Series)
3.pandas数据类型
pandas数据类型是指某一列里所有数据的共性,如果全是数字,那么就是数字型,入股其中有一个不是数据,那就不是数字型了。
pandas里的一列可以由Numpy数组组成,事实上大多NumPy的数据类型就是pandas的类型,pandas也有自己特有的数据类型
数据类型查看
数据表.dtypes可以返回该DataFrame中每一列的数据类型
如果需要单独查看某一列(Series)的数据类型,可以通过:数据表.列标签.dtype,虽然列标签应该是字符串,但是不需要使用引号表示文本。
pandas常见的数据类型包括:float、int、bool、datetime64[ns]、datetime64[ns, tz]、timedelta64[ns]、timedelta[ns]、category、object、string
这些数据类型大多继承自NumPy的相应数据类型,pandas提供了可以进行有限的数据类型转换的方法。
数据类型检测
可以使用类型判断方法,检测数据的类型是否与该方法中指定的类型一致,如果一致返回True,注意传入的是一个Series:
pd.api.types.is_float_dtype(df[‘列标签’])
pd.api.types.is_bool_dtype(s)
pd.api.types.is_categorical_dtype(s)
pd.api.types.is_datetime64_any_dtype(s)
pd.api.types.is_datetime64_ns_dtype(s)
pd.api.types.is_datetime64_dtype(s)
pd.api.types.is_float_dtype(s)
pd.api.types.is_int64_dtype(s)
pd.api.types.is_numeric_dtype(s)
pd.api.types.is_object_dtype(s)
pd.api.types.is_string_dtype(s)
pd.api.types.is_timedelta64_dtype(s)