学习笔记

初识pandas,生成数据、查看数据结构

pandas提供Series和DataFrame作为数组数据的存储框架,数据进入这两种框架后,我们就可以利用它们提供的强大处理方法进行处理。

名称维度数据
Series1带标签的一维同构数组
DataFrame2带标签的、大小可变的二维异构表格

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)

发表回复