介绍
- Pandas(Python Data Analysis Library)是一个流行的 Python 第三方库,是数据处理和数据分析中不可或缺的工具之一,用于数据处理和数据分析。
- 它提供了高效的数据分析方法和灵活且高效的数据结构。相比于其他的数据处理库,pandas更适用于处理具有关系型数据或者带标签数据的情况,在时间序列分析方面也有着不错的表现。
- 如果需要进行数据操作、清理、转换和分析,Pandas 通常是一个非常有用的工具。
核心数据类型
Series
-
Series :是 Pandas 中的一维数据结构,类似于一维数组或列表。
Series 可以存储任何数据类型,并且每个元素都有一个与之关联的标签,称为索引。 索引有助于对数据进行标记和命名,使得数据的访问更加方便和直观。
与传统的数组和列表不同,Pandas 的索引可以是任意数据类型,包括整数、字符串、日期等,不同元素的索引也可以是相同的。
在创建一个 Series 时,可以通过指定索引来为每个元素进行命名,这样一来就可以通过索引来访问和操作这些元素。
在访问 Series 中的元素时,同样需要使用索引来指定要访问的位置。
-
创建 Series 对象:
pandas.Series(data=None, index=None, dtype: Dtype = None, name=None, copy: bool=False, fastpath: bool = False)
-
data:指定 Series 中的数据,可以是列表、数组、字典、标量值等。必选参数
-
index:指定 Series 的索引,用于标识和访问数据。
索引可以是列表、数组、范围对象、标量值或其他 Series
如果没有显式指定索引,Pandas 将自动生成一个默认的整数索引
-
dtype:指定 Series 中数据的数据类型。如果不指定,Pandas 将尝试自动推断数据类型
-
name:指定 Series 的名称
-
copy:默认为 False。如果设置为 True,则会复制数据,而不是使用原始数据的引用。
-
-
示例
import pandas as pd import numpy as np # 创建Series(默认索引) data = pd.Series([1, np.nan, 6]) # 创建Series(自建索引) data = pd.Series([1, np.nan, 6], index=[0, 3, 4]) # 创建Series(通过字典直接创建带索引的数据) data = pd.Series({0: 1, 3: np.nan, 4: 6}) print(data) # 输出结果 0 1.0 3 NaN 4 6.0 dtype: float64
DataFrame
-
DataFrame :是 Pandas 中的二维数据结构,类似于 Excel 表格或 SQL 表,由行和列组成,并且可以存储不同类型的数据。
DataFrame 可以看做是一系列 Series 对象的集合,每个 Series 对象代表一列数据
在 DataFrame 中,索引的作用更加重要。除了可以为每一行和每一列指定索引外,DataFrame 还支持多级索引,也就是可以为行和列同时指定多个索引。这为多维数据的处理提供了更多的灵活性和功能性。
通过索引,可以轻松地从 DataFrame 中选择特定的行数和列数,可以通过指定行索引和列索引来选择任意子集的数据,也可以通过使用条件表达式来筛选满足特定条件的数据。
-
创建 DataFrame 对象:
pandas.DataFrame(data=None, index=None, dtype: Dtype = None, columns: Axes = None, copy: bool=False)
-
data:指定 Series 中的数据,可以是列表、数组、字典、标量值等。必选参数
-
index:指定 Series 的索引,用于标识和访问数据。
索引可以是列表、数组、范围对象、标量值或其他 Series
如果没有显式指定索引,Pandas 将自动生成一个默认的整数索引
-
dtype:指定 Series 中数据的数据类型。如果不指定,Pandas 将尝试自动推断数据类型
-
columns:指定 DataFrame 的列标签,用于标识和访问列。
列标签可以是列表、数组、范围对象、标量值或其他 Series。
如果没有显式指定列标签,Pandas 将自动生成默认的整数列标签。
-
copy:默认为 False。如果设置为 True,则会复制数据,而不是使用原始数据的引用。
-
-
示例:文章来源地址https://www.toymoban.com/news/detail-753187.html
import pandas as pd data = {'name': ['John', 'Emma', 'Mike', 'Lisa'], 'age': [28, 24, 32, 35], 'city': ['New York', 'London', 'Paris', 'Tokyo']} df1 = pd.DataFrame(data) # 通过columns指定DataFrame的列索引 data = [[1,'Bob', 24, 'American'],[2, 'Nancy', 23, 'Australia'],[3, 'Lili', 22, 'China'],[4, 'Leo', 27, 'M78'],[5, 'David', 24, 'moon']] df2 = pd.DataFrame(data, columns=['serial', 'name', 'age', 'from',]) # 自定义索引 df3 = pd.DataFrame(data, columns=['serial', 'name', 'age', 'from'], index=['a','b','c','d','e']) # df1 输出结果 name age city 0 John 28 New York 1 Emma 24 London 2 Mike 32 Paris 3 Lisa 35 Tokyo # df3 输出结果 serial name age from a 1 Bob 24 American b 2 Nancy 23 Australia c 3 Lili 22 China d 4 Leo 27 M78 e 5 David 24 moon
常用函数和方法
数据导入和导出
Pandas 可以从多种数据源导入数据,包括 CSV、Excel、SQL 数据库、JSON 等,并且可以将数据导出到这些格式。
-
pandas.read_csv() :从 CSV 文件导入数据,返回一个 DataFrame 对象(df)
参数说明:
- filepath_or_buffer :CSV 文件路径或文件对象。
- sep :可选,分隔符,默认为逗号
- header :可选,指定哪一行作为列名,默认为第一行
- index_col :可选,指定哪一列作为索引
-
pandas.read_excel() :从 Excel 文件导入数据,返回一个 DataFrame 对象(df)
参数说明:
- io :Excel 文件路径、文件对象或 URL
- sheet_name :可选,工作表名称
- header :可选,指定哪一行作为列名,默认为第一行
-
df.to_csv() :将数据导出为 CSV 文件
参数说明:
- path_or_buf :导出的文件路径或文件对象
- sep :可选,分隔符,默认为逗号
- index :可选,是否包含索引,默认为 True
-
df.to_excel() :将数据导出为 Excel 文件
参数说明:
- excel_writer :Excel 文件路径、文件对象或 ExcelWriter 对象
- sheet_name :可选,工作表名称
- index :可选,是否包含索引,默认为 True
-
示例
import pandas as pd # 从CSV文件导入数据 df = pd.read_csv('data.csv') # 将数据导出到Excel文件 df.to_excel('data.xlsx', index=False)
数据处理和转换
Pandas 提供了各种方法来处理缺失数据、重复数据、异常数据,以及进行数据变换、筛选和合并不同数据源的数据,包括连接、合并和联接等操作。
-
df.isnull() 和 df.notnull() :检测缺失值
-
df.drop() :删除行或列
-
df.dropna() :删除包含缺失值的行
-
df.drop_duplicates() :删除重复行
-
df.fillna(value) :填充缺失值
-
df.apply(func) :应用函数到行或列
-
df.groupby(‘column_name’).mean() :分组数据(聚合)
-
df.pivot_table() :创建透视表
-
df.melt() :将宽格式数据转换为长格式
-
示例
# 聚合操作 data = [[1,'Bob', 24, 'high-school'],[2, 'Nancy', 23, 'college'],[3, 'Lili', 22, 'college']] df = pd.DataFrame(data, columns=['serial', 'name', 'age', 'grade'], index=['a','b','c']) # 聚合,按grade分组,并计算分组后的平均年龄 xdf = df.groupby('grade')['age'].mean() # 透视表 pd.pivot_table(df, values='value_column', index='index_column', columns='column_to_pivot') # 应用自定义函数 df.apply(custom_function, axis=1)
数据合并和拆分
-
pd.concat() :用于合并行(纵向堆叠)或列(横向连接)数据,通常用于连接不同数据集的行或列,但不执行基于列的合并,不对数据重复值进行检查或处理,只是简单地将数据堆叠在一起
主要参数说明:
-
objs :要合并的数据对象列表,可以是 DataFrame 或 Series 的列表。唯一的必选参数
-
axis :指定合并的轴方向。默认为
0
,表示按行合并(纵向堆叠),如果设置为1
,表示按列合并(横向连接) -
join :指定连接的方式,默认为
'outer'
。可以取以下值:-
'outer'
:执行外连接,保留所有的行或列,并使用缺失值填充不存在的数据。 -
'inner'
:执行内连接,只保留共有的行或列。
-
-
ignore_index :默认为
False
。如果设置为True
,将忽略原始索引,创建新的连续整数索引。 -
keys :用于创建层次化索引的标签,可以是字符串、列表或数组。如果提供了 keys,将创建 MultiIndex。
**适用场景:**主要用于简单的数据堆叠操作,合并来自不同来源或处理方式的数据,如将多个相似的数据集按行堆叠在一起,或者将不同数据集的列拼接在一起
-
-
pd.merge() :用于基于列的合并,类似于 SQL 中的 JOIN 操作,用于将两个或多个数据框(DataFrame)根据一个或多个共享的列进行连接。
pd.merge()
通常会检查连接列中是否有重复值,并根据连接类型执行不同的处理操作,如 INNER JOIN、LEFT JOIN、RIGHT JOIN 或 FULL JOIN。主要参数说明:
- left:左侧的 DataFrame,用于合并的左侧数据。
- right:右侧的 DataFrame,用于合并的右侧数据。
-
how:指定连接方式,默认为
'inner'
。可以取以下值:-
'inner'
:执行内连接,只保留两个 DataFrame 中共有的行。 -
'outer'
:执行外连接,保留两个 DataFrame 中的所有行,缺失值用 NaN 填充。 -
'left'
:执行左连接,保留左侧 DataFrame 中的所有行,右侧 DataFrame 中没有匹配的行用 NaN 填充。 -
'right'
:执行右连接,保留右侧 DataFrame 中的所有行,左侧 DataFrame 中没有匹配的行用 NaN 填充。
-
- on:用于连接的列名(左右两侧 DataFrame 中具有相同名称的列)。可以是单个列名的字符串,或者是列名的列表(如果需要多列连接)。
- left_on:左侧 DataFrame 中用于连接的列名,如果左右两侧的连接列名称不同,可以使用该参数指定左侧的列名。
- right_on:右侧 DataFrame 中用于连接的列名,如果左右两侧的连接列名称不同,可以使用该参数指定右侧的列名。
-
left_index:默认为
False
。如果设置为True
,则使用左侧 DataFrame 的索引作为连接键。 -
right_index:默认为
False
。如果设置为True
,则使用右侧 DataFrame 的索引作为连接键。 -
suffixes:默认为
('_x', '_y')
。用于处理重叠列名的后缀字符串元组,可以指定在列名冲突时添加到列名末尾。 -
sort:默认为
False
。如果设置为True
,在合并后对结果进行排序。 -
copy:默认为
True
。如果设置为False
,尝试在不复制数据的情况下执行连接操作,可以提高性能。
**适用场景:**主要用于更复杂的基于列的数据连接和合并操作,基于共享列合并来自不同数据集的数据,通常用于数据关联、数据连接和数据库风格的合并操作。
-
pd.join() :函数根据索引或列的值进行连接
-
df.split() :将包含多个值的单个列拆分成多个列,从而使数据更加规整和易于处理
-
示例:
# 合并两个DataFrame merged_df = pd.concat([df1, df2], axis=0) # 数据库风格的连接 merged_df = pd.merge(df1, df2, on='key_column')
数据查看和概览
- df.head(n) :查看 DataFrame 的前 n 行,默认为 5 行
- df.tail(n) :查看 DataFrame 的后 n 行,默认为 5 行
- df.info() :查看 DataFrame 的基本信息,包括数据类型和非空值数量
- df.describe() :生成描述性统计信息,包括均值、标准差等
数据选择和检索
-
df[‘column_name’] :选择单列
-
df[[‘col1’, ‘col2’]] :选择多列
-
df.loc[row_label] :使用标签选择行
-
df.iloc[row_index] :使用整数索引选择行
-
df.query() :使用条件查询数据
-
示例:
# 选择列:可以使用列名或列索引来选择列。 df['name'] # 选择行:可以使用行索引来选择行。 df.loc['a'] # 切片方式访问。访问第二行到第三行数据 df.iloc[1:3]
数据筛选和过滤
-
df[df[‘column_name’] > value] :按条件筛选行
-
df[(condition1) & (condition2)] :使用逻辑运算符筛选行
-
示例
# 过滤行:可以使用条件表达式来过滤行。 df[df['age'] > 30]
数据排序和排名
-
df.sort_values(‘column_name’) :按列值排序
-
df.sort_index() :按索引排序
-
df.rank() :为数据分配排名
-
示例:
df = df.sort_values(by='age', ascending=False)
时间序列处理
Pandas 对时间序列数据提供了强大的支持,包括日期解析、时间索引和滚动窗口操作。
-
pd.to_datetime(arg, format) :将字符串转换为日期时间类型
- arg :日期时间字符串、时间戳、Series 等
- format :可选,指定日期时间格式
-
df.resample() :重采样时间序列数据
-
df.shift(periods, freq) :平移时间序列数据
-
示例:
# 解析日期列 df['date_column'] = pd.to_datetime(df['date_column']) # 创建时间索引 df.set_index('date_column', inplace=True) # 滚动窗口操作 df['rolling_mean'] = df['value_column'].rolling(window=3).mean()
数据可视化
Pandas 整合了 Matplotlib 库,可以轻松地可视化数据。
-
df.plot() :绘制数据可视化图表
- 可以通过参数指定图表类型(例如,‘line’、‘bar’、‘scatter’ 等)和其他绘图选项
-
df.hist() :绘制直方图
- 可以通过参数指定直方图的柱数、颜色等
-
df.boxplot() :绘制箱线图
- 可以通过参数指定是否显示
-
示例:
import matplotlib.pyplot as plt # 创建柱状图 df['column_name'].plot(kind='bar') # 创建散点图 df.plot.scatter(x='x_column', y='y_column') # 更多的可视化选项可以结合使用 Pandas 和 Matplotlib
高级用法
多级索引
-
Pandas 的多级索引功能非常强大,它允许在一个 DataFrame 中创建复杂的层次结构索引,从而更灵活地组织和分析数据。
一个常见的应用场景是使用多级索引来表示时间序列数据,比如将年份和季度作为索引的两个层级。
-
通过创建多级索引,可以将数据按照不同的层级进行划分和聚合。
例如,可以根据年份来对数据进行分组,然后在每个年份内再按照季度进行分组。这样,可以更方便地进行各种统计分析,比如计算每个季度的平均值、总和等。
-
在创建多级索引时,可以使用 Pandas 的 MultiIndex 类来指定索引的层级和标签。
通过指定层级的名称和对应的标签值,可以轻松地创建一个具有多级索引的 DataFrame。
-
使用多级索引可以带来很多好处,比如提高数据的查询效率、简化数据的操作和分析等。
但同时,也需要注意在使用多级索引时,要避免索引混淆和数据结构复杂度过高的问题。
因此,在使用多级索引时,需要根据具体的需求和数据特点来灵活应用。
-
示例:
import pandas as pd # 创建多级索引 index = pd.MultiIndex.from_tuples([('2019', 'Q1'), ('2019', 'Q2'), ('2020', 'Q1'), ('2020', 'Q2')]) data = pd.DataFrame({'Sales': [100, 200, 150, 250]}, index=index) # 查询特定季度的销售数据 print(data.loc[('2020', 'Q1')]) print("==================") # 查询特定年份的销售数据 print(data.loc['2020']) # 输出结果: Sales 150 Name: (2020, Q1), dtype: int64 ================== Sales Q1 150 Q2 250
透视表
-
透视表是一种根据数据中的一个或多个列创建汇总表格的方法。
Pandas 提供了
pivot_table()
函数,可以方便地对数据进行聚合和分析。通过
pivot_table()
函数,可以指定一个或多个列作为行索引,另一个或多个列作为列索引,然后根据指定的聚合函数对数据进行汇总。这样,就可以快速计算出各个行和列对应的统计量,比如平均值、总和、计数等。 -
Pandas 的透视表功能提供了一种方便、灵活的数据聚合和分析方法,可以帮助更好地理解和利用数据。
透视表的好处在于它提供了一种直观、简洁的方式来查看和分析数据。
通过透视表,可以轻松地对数据进行切片、切块和筛选,从而更深入地了解数据的特征和关系。
-
使用透视表时,可以根据具体的需求选择合适的聚合函数、行列索引和筛选条件,以获取想要的分析结果。
透视表不仅适用于单个 DataFrame,还可以用于多个 DataFrame 的合并和分析。
-
示例:
import pandas as pd # 创建一个包含销售数据的DataFrame data = pd.DataFrame({'Year': ['2019', '2019', '2020', '2020'], 'Quarter': ['Q1', 'Q2', 'Q1', 'Q2'], 'Product': ['A', 'B', 'A', 'B'], 'Sales': [100, 200, 150, 250]}) # 创建透视表 pivot_table = data.pivot_table(index='Year', columns='Quarter', values='Sales', aggfunc='sum') # 打印透视表 print(pivot_table) # 输出结果 Quarter Q1 Q2 Year 2019 100 200 2020 150 250
时间序列分析
-
在处理时间序列数据方面,Pandas 提供了灵活且高效的功能。
它的日期和时间处理功能包括日期范围生成、日期索引、日期加减运算、日期格式化等。可以轻松地创建日期范围,并使用这些日期作为数据的索引,便于对时间序列数据进行操作和分析。
-
Pandas 还支持重采样操作,可以将时间序列数据从一个频率转换为另一个频率。
例如,可以将按天采样的数据转换为按月采样的数据,或者将按小时采样的数据转换为按分钟采样的数据。重采样功能允许根据需要灵活地调整数据的粒度和频率。
-
Pandas 还提供了滑动窗口操作,可以在时间序列数据上执行滑动窗口统计计算。
可以定义窗口的大小和滑动的步长,并针对窗口内的数据进行汇总、聚合或其他计算操作。这对于处理时间序列数据中的移动平均值、滚动求和等任务非常有用。
-
示例:
import pandas as pd # 创建一个包含时间序列数据的DataFrame df = pd.DataFrame({'Date': pd.date_range(start='2020-01-01', periods=10), 'Sales': [100, 200, 150, 250, 180, 120, 300, 350, 400, 250]}) # 将日期列设置为索引 df.set_index('Date', inplace=True) # 计算每周销售总额 weekly_sales = df.resample('W').sum() # 打印每周销售总额 print(weekly_sales)
处理 Excel 文件
-
当使用 Pandas 处理 Excel 文件时,可以使用
read_excel()
函数来读取 Excel 数据,并将其加载到一个 DataFrame 中。然后可以对读取的数据进行各种操作和处理,例如筛选特定列的数据、根据条件筛选数据、对数据进行排序,在 DataFrame 中添加了新的列等等。文章来源:https://www.toymoban.com/news/detail-753187.html
-
示例:
import pandas as pd # 读取Excel文件 df = pd.read_excel('data.xlsx', sheet_name='Sheet1') # 显示DataFrame的前几行数据 print(df.head()) # 筛选特定列数据 selected_columns = ['Name', 'Age'] filtered_data = df[selected_columns] # 按条件筛选数据 condition = df['Age'] > 25 filtered_data = df[condition] # 数据排序 sorted_data = df.sort_values(by='Age', ascending=False) # 添加新列 df['Gender'] = ['Male', 'Female', 'Male', 'Female', 'Male'] # 写入到新的Excel文件 df.to_excel('new_data.xlsx', index=False)
到了这里,关于Python 数据处理与分析之 Pandas 库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!