Pandas
Pandas是Python的一个开源数据分析库,用作数据分析,有两个数据结构:Series、DataFrame
Series:一维数组,可以保存任何数据类型(整数、字符串、浮点数、Python对象等),Series带有索引,目前可以理解为一列数据。
DataFrame:二维表格型数据结构,可以看作是由Series组成的字典对象。DataFrame既有行索引也有列索引,它可以被看作是一个共享相同索引的多个Series对象的集合。
上图为通过pandas读取数据集展示出来的数据,以此为例我们来讲解Pandas的核心概念,以及这些概念的层级关系:
-
DataFrame
-
Series
-
索引列
-
索引名、索引值
-
索引下标、行号
-
-
数据列
-
列名
-
列下标
-
列值,具体的数据
-
-
-
其中最核心的就是Pandas中的两个数据结构:DataFrame和Series
Series对象
Series也是Pandas中的最基本的数据结构对象,下文中简称s对象;一般是DataFrame的列对象,series本身也具有行索引。
Series是一种类似于一维数组的对象,由下面两个部分组成:
values:一组数据(numpy.ndarray类型)
index:相关的数据行索引标签;如果没有为数据指定索引,于是会自动创建一个0到N-1(N为数据的长度)的整数型索引。
数据类型
Pandas的Series
数据结构可以容纳多种数据类型,以下是一些常见的数据类型:
-
整数类型 (Integer Types)
-
int8
,int16
,int32
,int64
: 这些是Pandas支持的整数类型,根据数据的范围和内存使用情况进行选择。默认情况下,整数数据通常会被存储为int64
。
-
-
浮点类型 (Floating-Point Types)
-
float16
,float32
,float64
: 这些是用于存储浮点数的类型,根据精度和内存需求来选择。默认情况下,浮点数数据通常会被存储为float64
。
-
-
对象类型 (Object Type)
-
object
: 用于存储字符串、混合类型数据或Python对象。这是非常灵活的数据类型,但可能会降低某些操作的性能。
-
-
布尔类型 (Boolean Type)
-
bool
: 用于存储布尔值(True或False)。
-
-
日期和时间类型 (Datetime Types)
-
datetime64[ns]
: 用于存储日期和时间数据,精确到纳秒。Pandas提供了丰富的日期和时间处理功能。
-
创建Series对象
通过numpy.ndarray来创建
-
自动生成索引
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'>
import numpy as np import pandas as pd # 1、创建numpy数组 print('------数组---------') n1_array = np.array([1,2,3,4,5]) # 将Python的列表转为numpy数组 print(n1_array) # 2、根据数组来得到series对象 print('-----series对象---------') # series对象 = 一列数据 + 行索引 """ 1、pandas 会将数组转为一列数据 2、pandas会自动的在列前边加上行索引,行索引默认从0开始 """ s1 = pd.Series(n1_array) print(s1)
指定索引
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)) # 输出结果如下: A 1 B 2 C 3 dtype: int64 <class 'pandas.core.series.Series'>
import numpy as np import pandas as pd # 1、创建numpy数组 print('------数组---------') n1_array = np.array([1,2,3,4,5]) # 将Python的列表转为numpy数组 print(n1_array) # 2、根据数组来得到Series对象 print('-----series对象---------') # series对象 = 一列数据 + 行索引 """ 1、pandas 会将数组转为一列数据 2、pandas会自动的在列前边加上行索引,行索引默认从0开始 3、打印出来的dtype: int64 是这一列的数据类型 """ # s1 = pd.Series(n1_array,['a','b','c','d','e']) # 位置传参 s1 = pd.Series(data = n1_array,index=['a','b','c','d','e']) # 关键字传入参数 print(s1)
通过list列表来创建
-
如果传入的数据类型是统一的数字,那么最终的dtype类型是int64
-
如果传入的数据类型是统一的字符串,那么最终的dtype类型是object
-
如果传入的数据类型是多种类型,那么最终的dtype类型也是object
import numpy as np
import pandas as pd
# 2、根据列表来得到Series对象
print('-----Series对象:使用默认索引---------') # series对象 = 一列数据 + 行索引
s1 = pd.Series([1,2,3,4,5]) # dtype: int64 通过列表得到Series对象
print(s1)
s2 = pd.Series([1,'hello',3,4,True]) # dtype: object 通过列表得到Series对象
print(s2)
print('-----Series对象:使用手动索引---------')
s3 = pd.Series(data=[1,'hello',3,4,True],index=['a','b','c','d','e']) # dtype: object 通过列表得到Series对象
print(s3)
通过字典或元组创建s对象
import pandas as pd
# 通过元组来生成s对象
print('---------通过元组来生成s对象-------------')
s1 = pd.Series((1, 2, 3, 4, 5))
print(s1)
# 通过字典来生成s对象
print('---------通过字典来生成s对象-------------')
# 默认将字典的键作为行索引,值当做一列
s2 = pd.Series({'name':'刘备','age':23,'gender':'男'})
print(s2)
Series对象常用属性和方法
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对象维度, 返回一个单个元素的元组, 元素个数代表维度数, 元素值代表值数量
# (行数,列数),由于s对象时一维的,只显示行数,如果以后使用DataFrame来调用,则是二维的,既有行,又有列
print(s1.shape) # (6,)
# 查看s对象数据类型
print(s1.dtypes)
print(s1.dtype)
# 获取s对象的数据值, 返回numpy的ndarray数组类型
print(s1.values) # [1 2 3 4 2 3] 本质上是一个numpy 数组
print(type(s1.values)) # <class 'numpy.ndarray'>
# 获取s对象的索引
# 前边是索引值,dtype是索引值类型,这里是字符串(object)
print(s1.index) # Index(['A', 'B', 'C', 'D', 'E', 'F'], dtype='object')
print('=================== 常用方法 ===================')
# 查看s对象值数量
print(len(s1))
# 查看s对象前5个值, n默认等于5
print(s1.head()) # 查询前5行数据
print(s1.head(n=2)) # 设置查询前2行数据
# 查看s对象后5个值, n默认等于5
print(s1.tail()) # 查询后5行数据
print(s1.tail(n=2)) # 设置查询后2行数据
# 获取s对象的索引
print(s1.keys()) # Index(['A', 'B', 'C', 'D', 'E', 'F'], dtype='object')
# s对象转换成python列表
print(s1.tolist())
print(s1.to_list()) # 作用同上
# s对象转换成DataFrame对象
print(s1.to_frame())
print(s1.to_frame().shape # (6,1) 输出是一个二维信 表格有6行1列
# s对象中数据的基础统计信息
print(s1.describe())
"""
count: 数据集中的元素数量。在这里是6。
mean: 数据集的平均值。所有数值相加后除以数值的数量。在这里是2.5。
std: 数据集的标准差。它描述了数值相对于平均值的离散程度。在这里是1.048809。
min: 数据集中的最小值。在这里是1。
25%: 数据集的四分位数(或百分位数)的第25个值。它表示有25%的数据小于或等于这个值。在这里是2。
50%: 数据集的中位数。它表示有一半的数据小于这个值,另一半大于这个值。在这里是2.5。
75%: 数据集的四分位数(或百分位数)的第75个值。它表示有75%的数据小于或等于这个值。在这里是3。
max: 数据集中的最大值。在这里是4。
"""
# 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()) # select 数字,count(*) from 表 group by 数字;
布尔值列表获取Series数据
从
scientists.csv
数据集中,列出大于Age
列的平均值的具体值,具体步骤如下:
import pandas as pd
# 将CSV文件数据读取到DataFrame中
df = pd.read_csv('data/scientists.csv')
print(df)
# print(df.head())
# 输出结果如下
Name Born Died Age Occupation
0 Rosaline Franklin 1920-07-25 1958-04-16 37 Chemist
1 William Gosset 1876-06-13 1937-10-16 61 Statistician
2 Florence Nightingale 1820-05-12 1910-08-13 90 Nurse
3 Marie Curie 1867-11-07 1934-07-04 66 Chemist
4 Rachel Carson 1907-05-27 1964-04-14 56 Biologist
5 John Snow 1813-03-15 1858-06-16 45 Physician
6 Alan Turing 1912-06-23 1954-06-07 41 Computer Scientist
7 Johann Gauss 1777-04-30 1855-02-23 77 Mathematicia
计算Age
列的平均值
# 获取一列数据 df[列名]
ages = df['Age']
print(ages)
print(type(ages))
print(ages.mean())
# 输出结果如下
0 37
1 61
2 90
3 66
4 56
5 45
6 41
7 77
Name: Age, dtype: int64
<class 'pandas.core.series.Series'>
59.125
输出大于Age
列的平均值的具体值
print(ages[ages > ages.mean()])
# 输出结果如下
1 61
2 90
3 66
7 77
Name: Age, dtype: int64
new_ages_s = ages > ages.mean()
print(new_ages_s) # series对象
print(new_ages_s.values) # numpy的ndarray数据类型
print(list(new_ages_s.values)) # python的list数据类型
# 输出结果如下
0 False
1 True
2 True
3 True
4 False
5 False
6 False
7 True
Name: Age, dtype: bool
[False True True True False False False True]
[False, True, True, True, False, False, False, True]
Series对象的运算
Series和数值型变量计算时,变量会与Series中的每个元素逐一进行计算;
两个Series之间计算时,索引值相同的元素之间会进行计算;索引值不同的元素的计算结果会用NaN值(缺失值)填充。
-
Series和数值型变量计算
# 加法 print(ages + 10) # 将age这个s对象的每一行都+10 # 乘法 print(ages * 2) # 输出结果如下 0 47 1 71 2 100 3 76 4 66 5 55 6 51 7 87 Name: Age, dtype: int64 0 74 1 122 2 180 3 132 4 112 5 90 6 82 7 154 Name: Age, dtype: int64
两个Series之间计算时,索引值相同的元素之间会进行计算;索引值不同的元素的计算结果会用NaN值(缺失值)填充
-
print(ages + ages) print('=' * 20) print(pd.Series([1, 100])) # 将列表转为s对象 print('=' * 20) print(ages + pd.Series([1, 100])) # 将两个s对象进行相加:索引能匹配则相加,不能匹配则补充维NaN # 输出结果如下 0 74 1 122 2 180 3 132 4 112 5 90 6 82 7 154 Name: Age, dtype: int64 ==================== 0 1 1 100 dtype: int64 ==================== 0 38.0 1 161.0 2 NaN 3 NaN 4 NaN 5 NaN 6 NaN 7 NaN dtype: float64
3 DataFrame对象
DataFrame是一个表格型的==结构化==数据结构,它含有一组或多组有序的列(Series),每列可以是不同的值类型(数值、字符串、布尔值等)。
-
DataFrame是Pandas中的最基本的数据结构对象,简称df;可以认为df就是一个二维数据表,这个表有行有列有索引
-
DataFrame是Pandas中最基本的数据结构,Series的许多属性和方法在DataFrame中也一样适用
-
创建DataFrame对象
DataFrame的创建有很多种方式:
Serires对象转换为df:上一小节中学习了
s.to_frame()
读取文件数据返回df:上一小节中我们使用了
pd.read_csv('csv格式数据文件路径')
的方式获取了df对象使用字典、列表、元组创建df
-
使用字典加列表创建df
import pandas as pd dict_data = { 'id': [1, 2, 3], 'name': ['张三', '李四', '王五'], 'age': [18, 20, 22] } # 1、将字典转为DataFrame,使用默认自增索引和默认列名 # 字典中的key值是df对象的列名,value值是对应列的数据值 df1 = pd.DataFrame(data=dict_data) print(df1) print(type(df1)) # 2、将字典转为DataFrame,使用自定义索引和列名 # 通过index参数指定索引, columns参数指定列的位置 df2 = pd.DataFrame(data=dict_data, index=['A', 'B', 'C'], columns=['id', 'age', 'name']) print(df2) # 输出结果如下 id name age 0 1 张三 18 1 2 李四 20 2 3 王五 22 <class 'pandas.core.frame.DataFrame'> id age name A 1 18 张三 B 2 20 李四 C 3 22 王五
使用列表加元组创建df,并自定义索引
list_data = [(1, '张三', 18), (2, '李四', 20), (3, '王五', 22)] # 将以上的列表+元组转为DataFrame df3 = pd.DataFrame(data=list_data, index=['A', 'B', 'C'], # 手动指定索引 columns=['id', 'name', 'age']) # 手动指定列名 print(df3) # 输出结果如下 id name age A 1 张三 18 B 2 李四 20 C 3 王五 22
3.2 DataFrame对象常用属性和方法
DataFrame对象常用属性和方法与Series对象的几乎相同
import pandas as pd
# 加载数据集, 得到df对象
df = pd.read_csv('../data/scientists.csv')
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行数据
print(df.head())
# 查看后5行数据
print(df.tail())
# 查看df的基本信息
df.info()
# 查看df对象中所有数值列的描述统计信息
print(df.describe())
# 查看df对象中所有非数值列的描述统计信息
# exclude:不包含指定类型列
print(df.describe(exclude=['int', 'float']))
# 查看df对象中所有列的描述统计信息
# include:包含指定类型列, all代表所有类型
print(df.describe(include='all'))
# 查看df的行数
print(len(df))
# 查看df各列的最小值
print(df.min())
# 查看df各列的非空值个数
print(df.count())
# 查看df数值列的平均值
print(df.mean())
3.3 布尔值列表获取DataFrame对象中部分数据
-
同Series一样,DataFrame也可以使用布尔值Series对象获取数据子集
# 加载数据集, 得到df对象
df = pd.read_csv('../data/scientists.csv')
# 通过布尔类型的s对象来过滤df对象中的数据
print(df['Age'] > df['Age'].mean())
print(df[df['Age'] > df['Age'].mean()])
# 输出结果如下
0 False
1 True
2 True
3 True
4 False
5 False
6 False
7 True
Name: Age, dtype: bool
Name Born Died Age Occupation
1 William Gosset 1876-06-13 1937-10-16 61 Statistician
2 Florence Nightingale 1820-05-12 1910-08-13 90 Nurse
3 Marie Curie 1867-11-07 1934-07-04 66 Chemist
7 Johann Gauss 1777-04-30 1855-02-23 77 Mathematician
# 获取第1、2、4、8行数据
# 通过布尔类型的列表来过滤df对象中的数据
# 布尔值列表个数要和df的行数相同
bool_list = [True, True, False, True, False, False, False, True]
print(df[bool_list])
# 输出结果如下
Name Born Died Age Occupation
0 Rosaline Franklin 1920-07-25 1958-04-16 37 Chemist
1 William Gosset 1876-06-13 1937-10-16 61 Statistician
3 Marie Curie 1867-11-07 1934-07-04 66 Chemist
7 Johann Gauss 1777-04-30 1855-02-23 77 Mathematician
DataFrame对象的运算
DataFrame和数值型变量计算时,变量会与DataFrame中的每个元素逐一进行计算,但df中存在非数值类型列时不能进行加减除运算;
两个DataFrame之间、以及df和s对象进行计算时,索引值相同的行之间会进行计算;索引值不同的行的计算结果会用NaN值(缺失值)填充。
-
df和数值型变量计算
总结
Pandas中的API太多,千万不要尝试去记忆,你记不住的,要求有印象、能找到、能看懂
-
理解类知识点
-
dataframe和series对象是什么:
-
可以认为df是有行有列有索引的二维数据表
-
df和s是Pandas中最核心的数据结构
-
df中每一列或者每一行都是s对象
-
s对象也有索引
-
每一个s对象都有各自的数据类型,表示构成这个s对象中的值的type;常用的数据类型有
-
Object -- 字符串
-
int -- 整数
-
float -- 小数
-
-
-
-
series和dataframe的API
# <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对应的(行)数据
-