1、pandas的数据结构分析

1、Series是一维的数据结构

2、DataFrame是二维的、表格型的数据结构

1.1、Series

1、Series是一个类似于一维数组的对象,能够保存任何类型的数据,比如整数、字符串、浮点数等,主要由一组数据与之相关的索引两部分构成。

2、Series类构造方法创建

class pandas.Series(data=None,index=None,dtype=None,
name=None,copy=False,fastpath=False)

上述构造方法中常用参数的含义如下:

(1)data:传入的数据,可以是ndarray、list等

(2)index:索引,必须是唯一的,且与数据的长度相同。如果没有传入参数,则默认会自动创建一个0~N的整数索引

(3)dtype:数据的类型

(4)copy:是否复制数据,默认为False

import pandas as pd #导入pandas库
# 创建Series类对象,并指定索引
ser_obj = pd.Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e'])
# 获取ser_obj的索引
ser_obj.index
# 获取ser_obj的数据
ser_obj.values
1.2、DataFrame

1、DataFrame是一个类似于二维数组或表格的对象,每列的数据可以是不同的数据类型。与Series的结构相似,DataFrame的结构也是由索引和数据组成的,不同的是,DataFrame的索引不仅有行索引,还有列索引。

2、构造方法创建

pandas.DataFrame(data=None,index=None,columns=None,
dtype=None,copy=False)

常用参数含义如下:

(1)index:行标签,默认会自动创建一个0~N的整数索引

(2)columns:列标签,默认会自动创建一个0~N的整数索引

import numpy as np
import pandas as pd
# 创建数组
demo_arr = np.array([['a', 'b', 'c'], ['d', 'e', 'f']])
# 常见DataFrame对象,指定列索引
df_obj = pd.DataFrame(demo_arr, columns=['No1', 'No2', 'No3'])
# 通过列索引的方式获取一列数据
element = df_obj['No2']
# 通过属性获取列数据
element = df_obj.No2

注意:在获取DataFrame的一列数据时,一般使用列索引的方式获取。

3、增加、删除一列数据

# 增加No4一列数据
df_obj['No4'] = ['g', 'h']
# 删除No3一列数据
del df_obj['No3']

2、Pandas索引操作及高级索引

2.1、索引对象

1、Pandas中的索引都是Index类对象,又称为索引对象,该对象是不可以进行修改的,以保障数据的安全。索引不支持可变操作

2、创建两个共用同一个Index对象的Series类对象

ser_obj1 = pd.Series(range(3), index=['a', 'b', 'c'])
ser_obj2 = pd.Series(range(3), index=ser_obj1.index)
2.2、重置索引

1、reindex()方法的作用是对原索引和新索引进行匹配

reindex()方法的语法格式如下:

DataFrame.reindex(labels=None,inedx=None,columns=None,
axis=None,method=None,copy=True,level=None,
fill_value=nan,limit=None,tolerance=None)

参数含义如下:

(1)index:用作索引的新序列

(2)method:插值填充方式

(3)fill_value:引入缺失值时使用的替代值

(4)limit:前向或者后向填充时的最大填充量

ser_obj = pd.Series([1, 2, 3, 4, 5], index=['c', 'd', 'a', 'b', 'e'])
# 重新索引时指定填充的缺失值
ser_obj2 = ser_obj.reindex(['a', 'b', 'c', 'd', 'e','f'],fill_value=6)

fill_value参数会让所有的缺失数据都填充为同一个值。

2、method参数

fill或pad			前向填充值
bfill或backfill		后向填充值
nearest				从最近的索引值填充
# 创建Series对象,并为其指定索引
ser_obj3 = pd.Series([1,3,5,7],index=[0,2,4,6])
# 重新索引,前向填充值
ser_obj3.reindex(range(6),method='ffill')
# 重新索引,后向填充值
ser_obj3.reindex(range(6),method='bfill')
2.3、索引操作
1、Series的索引操作

既可以通过索引的位置来获取,也可以使用索引名称来获取。

ser_obj = pd.Series([1, 2, 3, 4, 5], index=['a', 'b', 'c', 'd', 'e'])
ser_obj[2]  # 使用索引位置获取数据
ser_obj['c']  # 使用索引名称获取数据

使用切片来获取数据

ser_obj[2:4]    # 使用位置索引进行切片,取值区间为前闭后开
ser_obj['c':'e']    # 使用索引名称进行切片,取值结果都为闭区间

获取不连续的数据

ser_obj[[0,2,4]]    # 通过不连续位置索引获取数据集
ser_obj[['a','c','d']]  # 通过不连续的索引名称获取数据集

创建布尔型索引来筛选数据

ser_bool = ser_obj>2    # 创建布尔型Series对象
ser_obj[ser_bool]   # 获取结果为True的数据
2、DataFrame的索引操作

DataFrame既包含行索引,也包含列索引。行索引通过index属性获取,列索引通过columns属性获取。

arr = np.arange(12).reshape(3, 4)
# 创建DataFrame对象,并为其指定列索引
df_obj = pd.DataFrame(arr, columns=['a', 'b', 'c', 'd'])
df_obj['b']  #获取b列的数据
df_obj[['b', 'd']]  # 获取不连续的Series对象
df_obj[:2]  # 使用切片获取第0~1行的数据
# 使用多个切片先通过行索引获取第0~2行的数据
# 再通过不连续列索引获取第b、d列的数据
df_obj[:3][['b', 'd']]

使用Pandas提供的方法操作索引

(1)loc:基于标签索引(索引名称,如a、b等),用于按标签选取数据。当执行切片操作时,既包含起始索引,也包含结束索引。

(2)iloc:基于位置索引(整数索引,从0到length-1),用于按位置选取数据。当执行切片操作时,只包含起始索引,不包含结束索引。

arr=np.arange(16).reshape(4,4)
dataframe_obj=pd.DataFrame(arr,columns=['a','b','c','d'])
dataframe_obj.loc[:,['c','a']]
dataframe_obj.iloc[:,[2,0]]	# 结果与loc结果相同
dataframe_obj.loc[1:2,['b','c']]
dataframe_obj.iloc[1:3,[1,2]]	# 结果与loc结果相同

3、算术运算与数据对齐

Pandas执行算术运算时,会先按照索引进行对齐,对齐之后再进行相应的运算,没有对齐的位置会用NaN进行补齐。Series按行索引对齐,DataFrame按行索引和列索引对齐。

obj_one = pd.Series(range(10, 13), index=range(3))
obj_two = pd.Series(range(20, 25), index=range(5))
obj_one+obj_two     # 执行相加运算,没有对齐的位置使用NaN值进行填充

若不希望使用NaN来填充缺失值,调用add方法时提供fill_value参数的值对数据进行填充。

obj_one.add(obj_two,fill_value=0)   # 执行加法运算,补充缺失值

4、数据排序

4.1、按索引排序

Pandas按索引排序使用sort_index()方法,该方法可以用行索引或者列索引进行排序,sort_index()语法格式如下:

sort_index(axis=0,level=None,ascending=True,inplace=False,
 kind='quicksort',na_position='last',sort_remaining=True)

参数含义如下:

(1)axis:轴索引(排序的方向),0表示index(按行),1表示columns(按列)。

(2)level:若不为None,则对指定索引级别的值进行排序。

(3)ascending:是否升序排列,默认为True,表示升序。

(4)inplace:默认为False,表示对数据表进行排序,不创建新的实例。

(5)kind:选择排序算法。

ser_obj = pd.Series(range(10, 15), index=[5, 3, 1, 3, 2])
ser_obj.sort_index()  # 按索引进行升序排列
ser_obj.sort_index(ascending=False)  # 按索引进行降序排列
df_obj = pd.DataFrame(np.arange(9).reshape(3, 3), index=[4, 3, 5])
df_obj.sort_index()  # 按行索引升序排列
df_obj.sort_index(ascending=False)  # 按行索引降序排列

注意:当DataFrame进行排序操作时,要注意轴的方向。如果没有指定axis参数的值,则默认会按照行索引进行排序;如果指定axis=1,则会按照列索引进行排序。

4.2、按值排序

Pandas中按值排序的方法为sort_values(),该方法的语法格式为:

sort_values(by,axis=0,ascending=True,inplace=False,
            kind='quicksort',na_position='last')

参数含义如下:

(1)by:表示排序的列。

(2)na_position:只有两个值:first和last,若设为first,则会将NaN值放在开头;若设为last,则会将NaN值放在最后。

ser_obj = pd.Series([4, np.nan, 6, np.nan, -3, 2])
ser_obj.sort_values()  # 按值升序排列
df_obj = pd.DataFrame([[0.4, -0.1, -0.3, 0.0], [0.2, 0.6, -0.1, -0.7], [0.8, 0.6, -0.5, 0.1]])
df_obj.sort_values(by=2)  # 对列索引为2的数据进行排序

注意:当Series对象调用sort_value()方法按值进行排序时,所有缺失值默认都会放在末尾。在DataFrame中,sort_value()方法可以根据一个或多个列中的值进行排序,但是需要在排序时将一个或多个列的索引传递个by参数才行。

5、统计计算与描述

5.1、常见的统计计算
函数名称说 明函数名称说 明
sum计算std样本值的标准差
mean计算平均值skew样本值的偏度(三阶矩)
median获取中位数kurt样本值的峰度(四个阶矩)
max、min获取最大值和最小值cumsum样本值的累积和
idxmax、idxmin获取最大和最小索引值cummin、cummax样本值的累积最小值和累积最大值
count计算非NaN值的个数cumprod样本值的累计积
head获取前N个值describe对Series和DataFrame列计算汇总统计
var样本值的方差
df_obj=pd.DataFrame(np.arange(12).reshape(3,4),columns=['a','b','c','d'])
df_obj.sum()    # 计算每列的和
df_obj.max()    # 获取每列的最大值
df_obj.min(axis=1)  # 沿着横向轴,获取每行的最小值
5.2、统计描述

describe()方法的语法格式

describe(percentiles=None, include=None, exclude=None)

参数含义:

(1)percentiles:输出中包含的百分数,位于[0,1]之间。如果不设置该参数,则默认为[0.25,0.5,0.75],返回25%,50%,75%分位数。

(2)include,exclude:指定返回结果的形式。
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐