本文章参考蓝桥云课,csdn,百度。
介绍
Pandas 是一个非常著名的开源数据处理库,专为数据分析任务设计。基于 NumPy 开发的 Pandas 是 Scipy 生态系统的一部分,提供了高效处理大型数据集的函数和方法。Pandas 允许用户快速读取、转换、过滤和分析数据集,并拥有强大的缺失数据处理和数据透视功能,使其成为数据预处理的必备工具。
Pandas 的优势和核心在于其特有的数据结构。用户可以将任意格式的数据转换为 Pandas 的数据类型,然后使用 Pandas 提供的方法进行各种操作,最终获得所需的结果。
数据类型
Pandas 的数据类型主要有以下几种,它们分别是:Series(一维数组),DataFrame(二维数组),Panel(三维数组),Panel4D(四维数组),PanelND(更多维数组)。其中 Series 和 DataFrame 应用的最为广泛,几乎占据了使用频率 90% 以上。
Series
Series是 Pandas 中最基本的一维数组形式。其可以储存整数、浮点数、字符串等类型的数据。Series 基本结构如下:
pandas.Series(data=None, index=None)
data是字典,index是索引
举个例子
import pandas as pd
s = pd.Series({'a':1,'b':2,'c':3,'d':4})
print(s)
a 1
b 2
c 3
d 4
dtype: int64
#数值为1,2,3,4,索引是a,b,c,d。类型是int64
import numpy as np
import pandas as pd
s = pd.Series(np.random.randn(5))
print(s)
0 -0.168578
1 0.319380
2 -0.846043
3 0.190392
4 -0.172694
dtype: float64
DataFrame
DataFrame 是 Pandas 中最常见、最重要且使用频率最高的数据结构。它类似于电子表格或 SQL 表结构,可以看作是由多个 Series 拼合而成的扩展类型。与 Series 的直观区别在于,DataFrame 中的数据不仅具有行索引,还具有列索引。这种结构使得 DataFrame 非常适合用于处理和分析结构化数据。
pandas.DataFrame(data=None, index=None, columns=None) #columns 列索引
当不指定索引时,DataFrame 的索引同样是从 0 开始
DataFrame和Series的不同主要在于,后者没有列索引
例子
import pandas as pd
df = pd.DataFrame({'one': pd.Series([1, 2, 3]),
'two': pd.Series([4, 5, 6])})
print(df)
one two
0 1 4
1 2 5
2 3 6
import pandas as pd
df = pd.DataFrame({'one': [1, 2, 3],
'two': [4, 5, 6]})
print(df)
one two
0 1 4
1 2 5
2 3 6
import numpy as np
import pandas as pd
a = pd.DataFrame(np.random.randint(5, size=(2, 4))) # 是调用 numpy 库生成一个 2 行 4 列的数组,其中每个元素都是从 0 到 4(包括 0,不包括 5)之间的随机整数。pd.DataFrame(...) 是调用 pandas 库将上述生成的 numpy 数组转换为一个 pandas 数据框。
print(a)
0 1 2 3
0 3 4 0 4
1 3 4 2 4
random.randint()方法
random.randint(start, stop)
start -- 必需, 一个整数,指定开始值(包含在范围内),即生成的随机整数可以取到这个值。
stop -- 必需, 一个整数,指定结束值(包含在范围内),即生成的随机整数可以取到这个值。
数据读取
我们想要使用 Pandas 来分析数据,那么首先需要读取数据。大多数情况下,数据都来源于外部的数据文件或者数据库。Pandas 提供了一系列的方法来读取外部数据,非常全面。下面,我们以最常用的 CSV 数据文件为例进行介绍。
读取数据 CSV 文件的方法是 pandas.read_csv(),你可以直接传入一个相对路径,或者是网络 URL
df = pd.read_csv('csv文件的路径', encoding='编码格式') #读取
df.to_csv('文件要保存到的路径') #保存
基本操作
df.head() # 默认显示前 5 条
df.tail(7) # 指定显示后 7 条
df.describe() #数据概览
df.values #将 DataFrame 转换为 NumPy 数组
df.index # 查看索引
df.columns # 查看列名
df.shape # 查看形状
排序
sort_index()、sort_values()
- sort_index()
是按照索引(行或列)排序
sort_index(axis=0) --- 行排序
sort_index(axis=1) --- 列排序 - sort_values()
按照列或者值排序
sort_values(by,axis = 0,ascending = True,inplace = False,kind =' quicksort ',na_position ='last' )
by: str或str的列表,如果axis=0或axis='index',那么by='列名';如果axis=1或axis='columns',那么by='行名'
axis: {0或'index';1或'columns'} 默认为0,即纵向排序,如果为1,则为横向排序
ascending: 布尔型,默认为True,即升序
inplace: 布尔型,是否用排序后的数据代替现有数据
数据选择
import pandas as pd
import numpy as np
dates = pd.date_range('20240806', periods=6)
df = pd.DataFrame(np.arange(18).reshape((6, 3)), index=dates, columns=['A', 'B', 'C'])
"""np.arange(18)默认起点为0,步长1;reshape 6行3列"""
print(df)
A B C
2024-08-06 0 1 2
2024-08-07 3 4 5
2024-08-08 6 7 8
2024-08-09 9 10 11
2024-08-10 12 13 14
2024-08-11 15 16 17
获取前两行
print(df[0:2])
A B C
2024-08-06 0 1 2
2024-08-07 3 4 5
基于索引数字选择(iloc)
Pandas 中创建一个 DataFrame 后,如果没有明确指定行索引或列标签,Pandas 默认会将行索引设为从 0 开始的整数序列,而列标签则为数据集的第一行内容。此外,每一列也有一个隐式的数字索引,从 0 开始,只是默认情况下不显示出来。
为了基于数字索引选择数据,可以使用 .iloc 方法。以下是 .iloc 方法可以接受的不同类型的参数及其使用方式:
选择单行或单列
# 选择第 0 行
row_0 = df.iloc[0]
print(row_0)
输出:
A 0
B 1
C 2
Name: 2024-08-06 00:00:00, dtype: int64
# 选择第 0 列
col_0 = df.iloc[:, 0]
print(col_0)
输出:
2024-08-06 0
2024-08-07 3
2024-08-08 6
2024-08-09 9
2024-08-10 12
2024-08-11 15
Freq: D, Name: A, dtype: int64
选择多行或多列
# 选择第 0 行和第 1 行
rows_0_1 = df.iloc[[0, 1]]
print(rows_0_1)
输出
A B C
2024-08-06 0 1 2
2024-08-07 3 4 5
# 选择第 0 列和第 1 列
cols_0_1 = df.iloc[:, [0, 1]]
print(cols_0_1)
输出:
A B
2024-08-06 0 1
2024-08-07 3 4
2024-08-08 6 7
2024-08-09 9 10
2024-08-10 12 13
2024-08-11 15 16
切片
# 选择第 0 到第 2 行
rows_0_to_2 = df.iloc[0:3]
print(rows_0_to_2)
输出:
A B C
2024-08-06 0 1 2
2024-08-07 3 4 5
2024-08-08 6 7 8
# 选择第 0 到第 1 列
cols_0_to_1 = df.iloc[:, 0:2]
print(cols_0_to_1)
输出:
A B
2024-08-06 0 1
2024-08-07 3 4
2024-08-08 6 7
2024-08-09 9 10
2024-08-10 12 13
2024-08-11 15 16
布尔数组选择
# 选择列 'A' 中值大于 6 的行
rows_A_gt_6 = df.iloc[df['A'] > 6]
print(rows_A_gt_6)
输出:
A B C
2024-08-09 9 10 11
2024-08-10 12 13 14
2024-08-11 15 16 17
混合索引
# 选择第 0 行第 1 列的值
value_0_1 = df.iloc[0, 1]
print(value_0_1)
输出:
1
# 选择第 0 行和第 1、2 列的值
values_0_1_2 = df.iloc[0, [1, 2]]
print(values_0_1_2)
输出:
B 1
C 2
Name: 2024-08-06 00:00:00, dtype: int64
基于标签名选择(loc)
除了使用数字索引进行选择之外,Pandas 还允许我们基于标签名称选择数据。对于这个目的,我们可以使用 df.loc[] 方法。这个方法与 df.iloc[] 非常相似,但使用的是标签而不是位置索引。以下是 df.loc[] 方法可以接受的类型及其用法:
单个标签:例如 2 或 'a',这里的 2 指的是标签而不是索引位置。
列表或数组包含的标签:例如 ['A', 'B', 'C']。
切片对象:例如 'A':'E',这里的切片包括起始和结束标签。
布尔数组。
可返回标签的函数或参数。
让我们基于前面创建的 DataFrame 进行示例说明:
选择单个标签
# 选择标签为 '2024-08-06' 的行
row_20240806 = df.loc['2024-08-06']
print(row_20240806)
输出:
A 0
B 1
C 2
Name: 2024-08-06 00:00:00, dtype: int64
# 选择列 'A'
col_A = df.loc[:, 'A']
print(col_A)
输出:
2024-08-06 0
2024-08-07 3
2024-08-08 6
2024-08-09 9
2024-08-10 12
2024-08-11 15
Freq: D, Name: A, dtype: int64
选择多标签
# 选择标签为 '2024-08-06' 和 '2024-08-07' 的行
rows_20240806_20240807 = df.loc[['2024-08-06', '2024-08-07']]
print(rows_20240806_20240807)
输出:
A B C
2024-08-06 0 1 2
2024-08-07 3 4 5
# 选择列 'A' 和 'B'
cols_AB = df.loc[:, ['A', 'B']]
print(cols_AB)
输出:
A B
2024-08-06 0 1
2024-08-07 3 4
2024-08-08 6 7
2024-08-09 9 10
2024-08-10 12 13
2024-08-11 15 16
切片选择
# 选择标签从 '2024-08-06' 到 '2024-08-08' 的行
rows_slice = df.loc['2024-08-06':'2024-08-08']
print(rows_slice)
输出:
A B C
2024-08-06 0 1 2
2024-08-07 3 4 5
2024-08-08 6 7 8
# 选择列从 'A' 到 'B'
cols_slice = df.loc[:, 'A':'B']
print(cols_slice)
输出:
A B
2024-08-06 0 1
2024-08-07 3 4
2024-08-08 6 7
2024-08-09 9 10
2024-08-10 12 13
2024-08-11 15 16
布尔数组选择
# 选择列 'A' 中值大于 6 的行
rows_A_gt_6 = df.loc[df['A'] > 6]
print(rows_A_gt_6)
输出:
A B C
2024-08-09 9 10 11
2024-08-10 12 13 14
2024-08-11 15 16 17
混合索引选择
# 选择标签为 '2024-08-06' 行和列 'B' 的值
value_20240806_B = df.loc['2024-08-06', 'B']
print(value_20240806_B)
输出:
1
# 选择标签为 '2024-08-06' 行和列 'B' 和 'C' 的值
values_20240806_BC = df.loc['2024-08-06', ['B', 'C']]
print(values_20240806_BC)
输出:
B 1
C 2
Name: 2024-08-06 00:00:00, dtype: int64
pandas赋值等操作
import pandas as pd
import numpy as np
dates = pd.date_range('20240806', periods=6)
df = pd.DataFrame(np.arange(18).reshape((6, 3)), index=dates, columns=['A', 'B', 'C'])
print(df)
A B C
2024-08-06 0 1 2
2024-08-07 3 4 5
2024-08-08 6 7 8
2024-08-09 9 10 11
2024-08-10 12 13 14
2024-08-11 15 16 17
根据位置替换数据
df.iloc[0, 1] = 100 #将第一行第二列的数值改为100
print(df)
A B C
2024-08-06 0 100 2
2024-08-07 3 4 5
2024-08-08 6 7 8
2024-08-09 9 10 11
2024-08-10 12 13 14
2024-08-11 15 16 17
根据标签替换数据
df.loc["20240811", 'A'] = 100 #将20240811对应的A数值改为100
print(df)
A B C
2024-08-06 0 100 2
2024-08-07 3 4 5
2024-08-08 6 7 8
2024-08-09 9 10 11
2024-08-10 12 13 14
2024-08-11 100 16 17
插入行、列
df['D'] = pd.Series(['1', '2', '3', '4', '5', '6'], index=dates) #通过series数据的形式插入
print(df
A B C D
2024-08-06 0 100 2 1
2024-08-07 3 4 5 2
2024-08-08 6 7 8 3
2024-08-09 9 10 11 4
2024-08-10 12 13 14 5
2024-08-11 100 16 17 6
df.insert(2, 'F', [1, 2, 3, 4, 5, 6]) # 在第二列的右边插入一个新的D列
print(df)
A B F C D
2024-08-06 0 100 1 2 1
2024-08-07 3 4 2 5 2
2024-08-08 6 7 3 8 3
2024-08-09 9 10 4 11 4
2024-08-10 12 13 5 14 5
2024-08-11 100 16 6 17 6
删除
用到drop,在pandas中.drop开头的都与drop删减有关
df2 = df.drop(labels='20240808', axis=0) # 删除20240808行
print(df2)
A B C
2024-08-06 0 1 2
2024-08-07 3 4 5
2024-08-09 9 10 11
2024-08-10 12 13 14
2024-08-11 15 16 17
DataFrame.drop_duplicates 则通常用于数据去重,即剔除数据集中的重复值。使用方法非常简单,默认情况下,它会根据所有列删除重复的行。也可以使用 subset 指定要删除的特定列上的重复项,要删除重复项并保留最后一次出现,请使用 keep='last'。
DataFrame.dropna 主要的用途是删除缺少值,即数据集中空缺的数据列或行。
pandas对于空数据的处理
对空数值进行赋值
fillna函数
对空值进行赋值,此处赋值为1
print(df.fillna(value=1))
判断数据是否为空值
isnull()
#空值返回True,非空值返回Flase
print(df.isnull())