Pandas数据结构

学习目标

  • 知道什么是DataFrame对象、什么是Seires对象
  • 对Series和DataFrame的常用API有印象、能找到、能看懂
  • 知道Series以及DataFrame的运算规则

1 认识Pandas中的数据结构

上图为通过pandas读取数据集展示出来的数据,以此为例我们来讲解Pandas的核心概念,以及这些概念的层级关系:

  • DataFrame
  • Series
    • 索引列
      • 索引名、索引值
      • 索引下标、行号
    • 数据列
      • 列名
      • 列下标
      • 列值,具体的数据
        其中最核心的就是Pandas中的两个数据结构:DataFrame和Series

2 Series对象

  • Series也是Pandas中的最基本的数据结构对象,下文中简称s对象;是DataFrame的列对象或者行对象,series本身也具有行索引。
  • Series是一种类似于一维数组的对象,由下面两个部分组成:
  • values:一组数据(numpy.ndarray类型)
  • index:相关的数据行索引标签;如果没有为数据指定索引,于是会自动创建一个0到N-1(N为数据的长度)的整数型索引。

2.1 创建Series对象

2.1.1 语法

  • numpy.array(object, dtype=None, ndmin=0)

  • object:这是必填参数,表示要转换为数组的数据,可以是多种数据类型,如列表(包括嵌套列表)、元组、其他数组等。例如:np.array([1, 2, 3]),这里的[1, 2, 3]就是作为object的列表;或者np.array((4, 5, 6)),这里的(4, 5, 6)是作为object的元组。

  • ndmin:指定创建数组的最小维度。例如,np.array([1, 2, 3], ndmin = 2)会创建一个二维数组,即使输入的数据看起来像是一维的。

  • class pandas.Series(data=None, index=None)

  • data参数

    • 含义:data是Series构造函数中最主要的参数,它用来指定要存储在Series中的数据。
    • 数据类型:data可以是多种数据类型,例如:
      • Python 列表(list)或元组(tuple),如pd.Series([1, 2, 3])或pd.Series((4, 5, 6))。
      • NumPy 数组,例如pd.Series(np.array([7, 8, 9]))。
      • 标量值(单个数值、字符串等),如pd.Series(5, index=[0, 1, 2]),这将创建一个包含相同标量值的Series。
      • 字典(dictionary),字典的键将作为Series的索引(如果未另外指定索引),字典的值作为Series的数据,例如pd.Series({'a': 10, 'b': 20})。
  • index参数

    • 含义:index参数用于指定Series的索引,它定义了数据的标签。
    • 数据类型:
      • 可以是一个Index对象(这是pandas中专门用于表示索引的数据结构),例如pd.Index(['x', 'y', 'z'])可以作为索引传递给Series。
      • 也可以是其他类似序列的数据类型,如列表、元组等,例如pd.Series([100, 200, 300], index=['m', 'n', 'o'])。
      • 索引长度要求:index的长度必须与data的长度相同(当data是列表、数组等有序数据结构时)。如果data是标量,index的长度决定了Series的长度。例如,data为标量值5,index为[0, 1, 2],则会生成一个包含三个元素值都为5的Series。

2.1.2 通过numpy.ndarray数组来创建

2.1.2.1 路径
python 复制代码
# 0 创建 numpy.ndarray数组
# 1 通过 numpy.ndarray数组 来创建 Series对象(默认 索引)
# 2 通过 numpy.ndarray数组 来创建 Series对象(指定 索引 类型)
2.1.2.2 自动生成索引
py 复制代码
import numpy as np
import pandas as pd

# 创建numpy.ndarray对象
n1 = np.array([1, 2, 3])
print(n1)
print(type(n1))

# 创建Series对象
s1 = pd.Series(data=n1)
print(s1)
print(type(s1))

# 输出结果如下:
[1 2 3]
<class 'numpy.ndarray'>
0    1
1    2
2    3
dtype: int64
<class 'pandas.core.series.Series'>
  • 上面的结果中,左边显示的0,1是Series的索引,默认为0,1,2,3...,下边的dtype:int64就是该Series对象中值的数据类型
2.1.2.3 指定索引
py 复制代码
import numpy as np
import pandas as pd

# 创建numpy.ndarray对象
n1 = np.array([1, 2, 3])

# 创建Series对象, 同时指定索引
s1 = pd.Series(data=n1, index=['A', 'B', 'C'])

print(s1)

print(type(s1))
  • 左边的ABC就是指定的索引
  • 注意: pd.Series(...) 中 Series 的首字母别忘了大写

2.1.3 通过list列表来创建

2.1.3.1 路径
py 复制代码
# 导包 pandas
# 创建含字符串和整数的 Series 对象,,自动生成索引
# 创建含两个字符串的 Series,自动生成索引
# 创建含两个整数的 Series,自动生成索引
# 创建含有姓名和城市的 Series,自定义索引

2.1.3.2 实现

  • 如果传入的数据类型是统一的数字,那么最终的dtype类型是int64
  • 如果传入的数据类型是统一的字符串,那么最终的dtype类型是object
  • 如果传入的数据类型是多种类型,那么最终的dtype类型也是object
py 复制代码
import pandas as pd

# 创建Series对象
s1 = pd.Series(['banana', 42])
print(s1)

s2 = pd.Series(['banana', 'apple'])
print(s2)

s3 = pd.Series([50, 42])
print(s3)

# 自定义索引
s4 = pd.Series(['小明', '男'], index=['Name', 'Gender'])
print(s4)

2.1.4 通过字典或元组创建 Series 对象

2.1.4.1 路径
py 复制代码
# 1 使用元组 创建 Series 对象
# 2 使用字典 创建 Series 对象
2.1.4.2 实现
py 复制代码
# 1 使用元组 创建 Series 对象
import pandas as pd

s1 = pd.Series((1, 2, 3), index=['A', 'B', 'C'])
print(s1)
print("-----------------------")
print(type(s1))
py 复制代码
# 2 使用字典 创建 Series 对象
dict1 = {'name':'悟空','age':23, 'address':'花果山'}

s2 = pd.Series(dict1)
print(s2)
print('------------------')
print(type(s2))

2.2 Series对象常用属性和方法

2.2.1 api

  • 常见属性

  • 常见方法

2.2.2 路径

py 复制代码
import pandas as pd

# 创建s对象
s1 = pd.Series(data=[1, 2, 3, 4, 2, 3], index=['A', 'B', 'C', 'D', 'E', 'F'])
print(s1)
print('=================== 常用属性 ===================')
# 查看s对象值数量

# 查看s对象维度, 返回一个单个元素的元组, 元素个数代表维度数, 元素值代表值数量

# 查看s对象数据类型

# 获取s对象的数据值, 返回numpy的ndarray数组类型

# 获取s对象的索引

print('=================== 常用方法 ===================')
# 查看s对象值数量

# 查看s对象前5个值, n默认等于5

# 查看s对象后5个值, n默认等于5

# 获取s对象的索引

# s对象转换成python列表

# s对象转换成df对象

# s对象中数据的基础统计信息

# s对象最大值、最小值、平均值、求和值...

# s对象数据值去重, 返回s对象

# s对象数据值去重, 返回数组

# s对象数据值排序, 默认升序

# s对象索引值排序, 默认升序

# s对象不同值的数量, 类似于分组计数操作

2.2.3 实现

py 复制代码
import pandas as pd

# 创建s对象
s1 = pd.Series(data=[1, 2, 3, 4, 2, 3], index=['A', 'B', 'C', 'D', 'E', 'F'])
print(s1)
print('=================== 常用属性 ===================')
# 查看s对象值数量
print(s1.size)
# 查看s对象维度, 返回一个单个元素的元组, 元素个数代表维度数, 元素值代表值数量
print(s1.shape)
# 查看s对象数据类型
print(s1.dtypes)
print(s1.dtype)
# 获取s对象的数据值, 返回numpy的ndarray数组类型
print(s1.values)
print(type(s1.values))
# 获取s对象的索引
print(s1.index)

print('=================== 常用方法 ===================')
# 查看s对象值数量
print(len(s1))
# 查看s对象前5个值, n默认等于5
print(s1.head())
print(s1.head(n=2))
# 查看s对象后5个值, n默认等于5
print(s1.tail())
print(s1.tail(n=2))
# 获取s对象的索引
print(s1.keys())
# s对象转换成python列表
print(s1.tolist())
print(s1.to_list())
# s对象转换成df对象
print(s1.to_frame())
# s对象中数据的基础统计信息
print(s1.describe())
# s对象最大值、最小值、平均值、求和值...
print(s1.max())
print(s1.min())
print(s1.mean())
print(s1.sum())
# s对象数据值去重, 返回s对象
print(s1.drop_duplicates())
# s对象数据值去重, 返回数组
print(s1.unique())
# s对象数据值排序, 默认升序
print(s1.sort_values(ascending=True))
# s对象索引值排序, 默认升序
print(s1.sort_index(ascending=False))
# s对象不同值的数量, 类似于分组计数操作
print(s1.value_counts())

2.3 布尔值列表获取Series对象中部分数据

2.3.1 路径

1 加载并观察数据集
2 获取年龄列
3 求平均年龄
4 求高于平均年龄 组成 布尔结果
5 求高于平均年龄 组成 年龄列

2.3.2 实现

py 复制代码
- 1 加载并观察数据集
# 1 加载并观察数据集
import pandas as pd

df = pd.read_csv("./data/a_scientists.csv")
df
- 2 获取年龄列
# 2 获取年龄列
ages = df['Age']
print(ages)
print(type(ages))
- 3 求平均年龄
# 3 求平均年龄
print(ages.mean())
- 4 求高于平均年龄 组成 布尔结果
# 4 求高于平均年龄 组成 布尔结果
ages > ages.mean() 
- 5 求高于平均年龄 组成 年龄列
# 5 求高于平均年龄 组成 年龄列
high_ages = ages[ages > ages.mean()]
print(high_ages)

2.4 Series对象的运算

Series和数值型变量计算时,变量会与Series中的每个元素逐一进行计算;

两个Series之间计算时,索引值相同的元素之间会进行计算;

索引值不同的元素的计算结果会用NaN值(缺失值)填充。

2.4.1 路径

# Series和数值型变量计算: ages + 10
# Series和数值型变量计算: ages * 2
# 将列表[1, 10, 100] 转成 Series对象 s2
# ages + s2 打印 且 观察效果 

2.4.2 实现

py 复制代码
- 查看原始数据
ages
py 复制代码
- Series和数值型变量计算: ages + 10
ages + 10
py 复制代码
- Series和数值型变量计算: ages * 2
ages * 2
py 复制代码
- 将列表[1, 10, 100] 转成 Series对象 s2
s2 = pd.Series([1, 10, 100])
s2
py 复制代码
- ages + s2 打印 且 观察效果 
ages + s2

3. DataFrame对象

DataFrame是一个表格型的结构化数据结构,它含有一组或多组有序的列(Series),每列可以是不同的值类型(数值、字符串、布尔值等)。

  • DataFrame是Pandas中的最基本的数据结构对象,简称df;可以认为df就是一个二维数据表,这个表有行有列有索引
  • DataFrame是Pandas中最基本的数据结构,Series的许多属性和方法在DataFrame中也一样适用

3.1 创建DataFrame对象

3.1.1 路径

通过 pd.read_csv('xxx') 返回 df
将 Series对象 通过 to_frame() 转成 df
使用 列表 加 元组 返回 df
使用 字典 返回 df

3.1.2 实现

py 复制代码
- 通过 pd.read_csv('xxx') 返回 df
import pandas as pd

# 通过 pd.read_csv('xxx') 返回 df
df = pd.read_csv("./data/a_scientists.csv")
type(df)
[图片]
- 将 Series对象 通过 to_frame() 转成 df
ages = df['Age']
type(ages)

# 将 Series对象 通过 to_frame() 转成 df
df2 = ages.to_frame()
print(df2)
print(type(df2))
[图片]
- 使用 列表 加 元组 返回 df
# 使用 列表 加 元组 返回 df
student_list = [(1, '张三', 18), (2, '李四', 19), (3, '王五', 28)]
df3 = pd.DataFrame(student_list)
print(df3)
print(type(df3))
[图片]
df3_2 = pd.DataFrame(data=student_list, columns=['id', 'name', 'age'], index=['A', 'B', 'C'])
df3_2
[图片]
- 使用 字典 返回 df
# 使用 字典 返回 df
dict1 = {'id':[1, 2, 3], 'name':['张三', '李四', '王五'], 'age':[18, 19, 28]}
df4 = pd.DataFrame(dict1)
df4
[图片]
dict1 = {'id':[1, 2, 3, 4], 'name':['张三', '李四', '王五', '赵六'], 'age':[18, 19, 28, 29]}
df4 = pd.DataFrame(dict1, index=['A', 'B', 'C', 'D'], columns=['id', 'name'])
df4
[图片]

3.2 DataFrame对象常用属性和方法
DataFrame对象常用属性和方法与Series对象的几乎相同
import pandas as pd

# 加载数据集, 得到df对象
df = pd.read_csv('../data/a_scientists.csv')
df

3.2.1 路径

py 复制代码
print('=============== 常用属性 ===============')
# 查看维度, 返回元组类型 -> (行数, 列数), 元素个数代表维度数

# 查看数据值个数, 行数*列数, NaN值也算

# 查看数据值, 返回numpy的ndarray类型

# 查看维度数

# 返回列名和列数据类型

# 查看索引值, 返回索引值对象

# 查看列名, 返回列名对象


print('=============== 常用方法 ===============')
# 查看前5行数据

# 查看后5行数据

# 查看df的基本信息

# 查看df对象中所有数值列的描述统计信息

# 查看df对象中所有非数值列的描述统计信息
# exclude:不包含指定类型列

# 查看df对象中所有列的描述统计信息
# include:包含指定类型列, all代表所有类型

# 查看df的行数

# 查看df各列的最小值

# 查看df各列的非空值个数

# 查看df数值列的平均值

3.2.2 实现

py 复制代码
print('=============== 常用属性 ===============')
# 查看维度, 返回元组类型 -> (行数, 列数), 元素个数代表维度数
print(df.shape)

# 查看数据值个数, 行数*列数, NaN值也算
print(df.size)

# 查看数据值, 返回numpy的ndarray类型
print(df.values)

# 查看维度数
print(df.ndim)

# 返回列名和列数据类型
print(df.dtypes)

# 查看索引值, 返回索引值对象
print(df.index)

# 查看列名, 返回列名对象
print(df.columns)

print('=============== 常用方法 ===============')
# 查看前5行数据
df.head()

# 查看后5行数据
df.tail()

# 查看df的基本信息
df.info()

# 查看df对象中所有数值列的描述统计信息
df.describe()

# 查看df对象中所有非数值列的描述统计信息
# exclude:不包含指定类型列
print(df)
print(df.describe(exclude=['int', 'float']))

# 查看df对象中所有列的描述统计信息
# include:包含指定类型列, all代表所有类型
print(df.describe(include='all'))
print(df)

# 查看df的行数
print(len(df))

# 查看df各列的最小值
print(df.min())

# 查看df各列的非空值个数
print(df.count())

# 查看df数值列的平均值
print(df.mean())

3.3 布尔值列表获取DataFrame对象中部分数据

  • 同Series一样,DataFrame也可以使用布尔值Series对象获取数据子集

3.3.1 路径

# 加载数据 ./data/a_scientists.csv
# 求 平均年龄
# 求 是否高于平均年龄
# 求高于平均年龄的数据
# 求高于平均年龄的数据(列表)

3.3.2 实现

py 复制代码
- 加载数据 ./data/a_scientists.csv
import pandas as pd

df = pd.read_csv("./data/a_scientists.csv")
df
  - 
- 求 平均年龄
df['Age'].mean()
  - 
- 求 是否高于平均年龄
df['Age'] > df['Age'].mean()
  - 
- 求高于平均年龄的数据
df[df['Age'] > df['Age'].mean()]
  - 
- 求高于平均年龄的数据(列表)
list1 = list(df['Age'] > df['Age'].mean())
df[list1]
  • 本质就是传入布尔值构成的列表,来获取部分数据,True所对应的数据会被保留

3.4 DataFrame对象的运算

DataFrame和数值型变量计算时,变量会与DataFrame中的每个元素逐一进行计算,但df中存在非数值类型列时不能进行加减除运算;

两个DataFrame之间、以及df和s对象进行计算时,索引值相同的行之间会进行计算;索引值不同的行的计算结果会用NaN值(缺失值)填充。

3.4.1 路径

加载数据 df
观察 df + 2
观察 df + df
观察 df * 2
获取 是否是 [0, 2, 4] 的下标列表 isin

3.4.2 实现

py 复制代码
- 加载数据 df
import pandas as pd

df = pd.read_csv("./data/a_scientists.csv")
df
py 复制代码
- 观察 df + 2
df + 2
py 复制代码
- 观察 df + df
df + df
py 复制代码
- 观察 df * 2
df * 2
  • 同上 df + df
  • 获取 是否是 [0, 2, 4] 的下标列表( isin )
py 复制代码
df.index
df.index.isin([0, 2, 4])
df[df.index.isin([0, 2, 4])]
py 复制代码
- 获取 下标为 0 2 4 数据
df[df.index.isin([0, 2, 4])]

总结

Pandas中的API太多,千万不要尝试去记忆,你记不住的,要求有印象、能找到、能看懂

  • 理解类知识点
    • dataframe和series对象是什么:
      • 可以认为df是有行有列有索引的二维数据表
      • df和s是Pandas中最核心的数据结构
      • df中每一列或者每一行都是s对象
      • s对象也有索引
      • 每一个s对象都有各自的数据类型,表示构成这个s对象中的值的type;常用的数据类型有
        • Object -- 字符串
        • int -- 整数
        • float -- 小数
  • series和dataframe的API
py 复制代码
# <s/df>表示s对象或df对象
<s/df>.size # 返回数据个数
<s/df>.shape # s返回(行数,),df返回(行数,列数)
<s/df>.dtypes # s返回数据类型,df返回列名和该列数据的类型
<s/df>.values # 返回全部值
<s/df>.index # 查看索引
<s/df>.head() # s返回前5个数据,df返回前5行数据
<s/df>.tail() # s返回后5个数据,df返回后5行数据
df.info() # 返回df的基本信息:索引情况,以及各列的名称、数据数量、数据类型;s对象没有这个函数
<s/df>.describe() # 返回s或df对象中所有数值类型数据的基础统计信息
df.describe(include='all') # 返回df对象中全部列数据的基础统计信息
  • series以及dataframe的运算
    • 当s或df和数值进行运算时,每一个具体的值会分别和数值进行运算,但s或df中的数据存在非数值类型时不能做加减除法运算
    • 两个s之间、两个df之间,以及df和s对象进行计算,会根据索引的值进行对应计算,当两个对象的索引值不能对应时,不匹配的会返回NaN
  • 判断表达式
    • s对象的判断表达式返回由布尔值构成的numpy.ndarray数组
    • 布尔值列表或数组获取s或df对象中部分数据的方法:返回True对应的(行)数据
相关推荐
勇敢滴勇1 小时前
【排序算法】插入排序_直接插入排序、希尔排序
c语言·数据结构·算法·排序算法
丕羽1 小时前
【Python数据分析】pandas apply自定义函数+分组操作+分析案例
python·数据分析·pandas
gugugu.2 小时前
数据结构:二叉树OJ题(基础版)
数据结构
张三xy2 小时前
数据结构 第三章 栈和队列 练习题3.2.4 迷宫求解 C语言代码
c语言·数据结构·算法
X同学的开始3 小时前
数据结构之二叉树的暴力删除
数据结构
misty youth3 小时前
有理数四则运算
c语言·数据结构·算法·c#
程序员波特3 小时前
基础数据结构之数组
java·数据结构·算法·leetcode
¥ 多多¥9 小时前
数据结构:内存的使用
linux·c语言·开发语言·数据结构
小灰灰爱代码9 小时前
C++——将数组a[5]={-1,2,9,-5,7}中小于0的元素置成0。并将其结果输出(要求:用数组名作为函数的参数来实现)
数据结构·c++·算法