An Introduction to Data Preparation Using Pandas Librar
作者:禅与计算机程序设计艺术
1.简介
近年来, 数据科学与人工智能技术正在成为推动互联网行业发展的重要引擎之一。如何高效地进行数据准备, 是决定模型性能与应用效果的关键因素之一。Pandas库作为一种功能强大的开源数据处理工具, 提供了高效且易于使用的功能模块, 能够实现从数据分析到数据清洗, 从特征提取到自动化处理等多方面的操作流程。本文旨在系统介绍Pandas的基本功能及其在实际应用中的操作技巧。
2.背景介绍
数据预处理(Data preparation)是将原始数据转换为机器学习算法可使用的标准形式的过程。其核心目标就是为后续分析和建模奠定基础。在现代数据分析领域中,它被视为不可或缺的一环。通过Pandas库的学习与实践,在Python环境中能够高效地完成各种预处理任务。具体而言,在这一过程中需要完成的任务包括对缺失值、异常值以及冗余值的识别与处理,并通过筛选和去噪等方法去除这些干扰因素。只有在确保数据质量的前提下才能有效提升模型性能,并最终实现准确可靠的分析结果。
什么是pandas?
Pandas是一个开源的数据处理工具库,在Python编程环境中广泛应用于数据分析工作。它类似于Excel的高级版本,在Python语言中提供了强大而灵活的数据操作能力。该库以其高效的性能和丰富多样的功能著称,并且支持大规模数据集的操作与分析工作。Pandas内置了大量实用功能模块包括但不限于缺失值填充日期时间运算分组聚合合并重塑等功能以简化复杂的数据分析流程该库还配备了详尽的学习资源包括官方文档教学视频案例教程以及活跃的社区支持系统使其成为数据分析领域不可替代的重要工具
为什么要使用pandas?
Pandas 是一个功能丰富且灵活运用的Python数据处理和分析工具;它能够高效地进行数据清洗、聚合、合并以及生成可视化图表等功能;主要体现在以下几个方面:
在数据分析领域中进行数据结构化处理时,Pandas通过使用DataFrame来实现对核心数据的组织。作为一种二维表格式的数据存储结构,DataFrame由行和列表示,并能够容纳不同类型的字段值(如数字、字符串或日期)。它不仅支持单个字段(即Series)的操作与查询功能,在数据分析过程中还能够有效地管理复杂的多字段关系
支持获取索引:在DataFrame中使用Index进行数据组织是一种有效的方法。每个表格中的记录都通过唯一的识别标记进行编排,并且可以通过该标记便捷地获取相关信息。
-
缺失值处理:Pandas提供了多种方式处理缺失值,包括删除、填充、插值等。
-
统计运算:Pandas提供了丰富的统计运算功能,如描述性统计、汇总统计等。
-
合并、连接、重塑:Pandas提供了多种方式合并、连接、重塑数据集。
-
数据可视化:Pandas提供了各种类型的图表,可直观地呈现数据。
生态系统:Pandas提供了丰富且全面的生态系统库,在数据处理方面涵盖了从导入到导出的各种操作流程,并支持数据合并方法、排序技术以及分组分析等多种功能模块。此外,社区成员还分享了大量学习资料和问题解答支持以协助用户解决实际操作中的常见难题。
pandas适用的场景
Pandas广泛应用于多个领域,在实际应用中常需处理多维度复杂的数据。这些数据集合可能常见于不同数据类型缺失值冗余值等特征并常常面临重叠性不平衡性以及异常点等多种挑战。Pandas则通过其丰富工具集帮助数据分析人员高效处理各类复杂场景中的数据从而显著提升了工作效率
3.基本概念术语说明
3.1 DataFrame
Pandas库中的核心数据对象——DataFrame。 dataframe类似于电子表格工具, 其结构由多维数组和附加的索引系统组成. 在这些结构中, 我们可以采用类似于字典形式的数据键值对来存储信息. 每一行的数据记录通常通过整数索引系统来进行标识, 然而, 在某些情况下我们需要通过指定其他特定标签来进行区分. 每一列的数据字段则可以通过其名称来进行识别和访问. 如上图所示:
3.2 Series
Series是一种一维数据容器,在结构上与其所使用的存储库模块类似,在Python库pandas中被定义为一种专为存储一维齐次数据而设计的数据结构。在功能上类似于针对数据对象设计的纵向数据列,在这种组织形式下通常会附加一些用于数据分析的功能属性。在功能上类似于针对数据对象设计的纵向数据列,在这种组织形式下通常会附加一些用于数据分析的功能属性。与DataFrame相比,则仅包含两个维度:索引和值轴;如图所示:
3.3 Index
在pandas框架中,索引(Index)被定义为一种用于标识数据集中各个元素的标签性集合。这种集合通常具有的名称,并且能够追踪其位置或状态。其类型多样,包括整数型、日期型、字符串型和元组等多种形式。然而,在同一个DataFrame中,则要求每个索引必须同时满足唯一性和存在性的要求。为了确保数据的一致性和准确性,在同一个DataFrame中,则要求每个索引必须同时满足唯一性和存在性的要求。通过使用合适的索引类型和策略,则可以使我们在进行数据切片定位时更加高效便捷;此外,在处理聚合操作时也能够显著提升效率与效果。
3.4 MultiIndex
在pandas中,MultiIndex被称为表示复杂层次化索引的一种数据结构。与其他单一层次的索引不同,则主要区别在于拥有多个层级。这些复杂的多层级数据组织方式通常会与其所关联的Panel对象相互作用,并在本文中不涉及详细讨论。
4.核心算法原理和具体操作步骤以及数学公式讲解
4.1 缺失值处理
Pandas中有两种方法处理缺失值,分别是dropna()方法和fillna()方法。
import numpy as np
import pandas as pd
# 创建测试数据集
data = {'Name': ['Tom', 'Jack', None],
'Age': [28, np.nan, 34]}
df = pd.DataFrame(data)
print("Original DataFrame:\n", df)
# 使用dropna()方法删除缺失值
df_droped = df.dropna()
print("\ndropna():\n", df_droped)
# 使用fillna()方法填充缺失值
df['Age'].fillna(value=0, inplace=True)
print("\nfillna():\n", df)
代码解读
输出:
Original DataFrame:
Name Age
0 Tom 28.0
1 Jack NaN
2 <NA> 34.0
dropna():
Name Age
0 Tom 28.0
1 Jack 0.0
fillna():
Name Age
0 Tom 28
1 Jack 0
代码解读
在上述代码中
4.2 异常值检测
用于异常值检测的方法主要包括箱线图法、散点图法以及极值检测法。在本研究中,我们采用了箱线图法与极值检测法来进行异常数据识别。
(1)箱线图法
箱线图法主要通过观察数据分布形态来判断其偏态特性。由五个垂直线条构成的箱线图中包含关键统计信息:最下面的线条代表数据的最小值、中间位置的线条显示数据分布范围的主要部分即中位数所在位置、上方第二条线条代表第一四分位数的位置以及最上面一条线条显示最大值的位置。当箱体部分之间的间距相对较小且上下的四分位数值差距明显时暗示数据可能偏离正态分布趋势提示可能需要尝试其他分析方法
假设存在一个变量,取值范围在1至100之间的随机数值。通过计算样本均值与中位数这一指标序列的差异性程度来判断该分布是否服从正态分布:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
np.random.seed(1) # 设置随机种子
nums = np.random.randint(1, 100+1, size=100) # 生成100个随机整数
df = pd.DataFrame({'nums': nums}) # 将生成的随机数存入DataFrame
fig, ax = plt.subplots(figsize=(12,8))
sns.boxplot(x='nums', data=df) # 画箱线图
plt.show()
代码解读
在图表中横轴标示变量数值,在纵轴则展示各个数值出现的概率密度。通过箱线图我们可以清晰地观察到数据的整体分布情况。其中左边框框代表数据中的最小观测值(即第一栏),中间左侧盒子部分对应的是第一个四分位数Q1(即第三栏),右边框框则是数据中的最大观测值(即第五栏),而中间矩形区域对应的是第二个四分位数Q2(即第四部分)。通过观察箱线图的数据特征分析可知,在本案例中该变量的样本均值与中位数十分接近(即接近于Q2),其离散程度较为适中(即范围不大),因此初步判断其服从正态分布特性
(2)散点图法
散点图是一种查看变量之间关系的有效工具。通过观察数据点的分布情况,我们可以识别是否存在明显的规律或异常数据点。
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
np.random.seed(1) # 设置随机种子
nums1 = np.random.normal(loc=0, scale=1, size=100) # 产生100个服从标准正态分布的随机数
nums2 = nums1 + np.random.normal(scale=0.5, size=100) # 产生100个服从中心值为0,标准差为0.5的正态分布的随机数
df = pd.DataFrame({'nums1': nums1, 'nums2': nums2}) # 将生成的随机数存入DataFrame
sns.scatterplot(x="nums1", y="nums2", data=df) # 画散点图
plt.show()
代码解读
上述代码生成两个随机变量nums1和nums2,并将它们相加后加入噪声。随后绘制I型散点图,在图表中可以看出变量之间存在明显的线性关联关系然而并未发现明显的模式或异常值。
(3)极值检测法
极值检测法建立在以下假设基础之上:其超出均值的程度不应超出合理范围。当数据分布中出现高于均值的异常观测时,并且这些异常观测的数量显著多于均值的数量,则这些异常观测可能被视为异常点。此外,在这种情况下,在某些情况下,在这种情况下,在这种情况下
from scipy import stats
def detect_outliers(nums):
mean = np.mean(nums)
std = np.std(nums)
lower_bound = mean - (3 * std)
upper_bound = mean + (3 * std)
outlier_indices = []
for i in range(len(nums)):
if not (lower_bound <= nums[i] <= upper_bound):
outlier_indices.append(i)
return outlier_indices
nums = np.random.rand(100)
num_outliers = len(detect_outliers(nums))
print("Percentage of outliers:", num_outliers / len(nums) * 100)
代码解读
上述代码实现了对数据异常值检测的功能detect\_outliers。该函数接收一个数值序列作为输入参数,并将所有满足异常值条件的数据点对应的索引位置返回给调用者。具体而言,在执行过程中首先计算输入序列的基本统计指标:平均数与标准差。随后设定数据范围上下限:下边界为lower\_bound、上边界为upper\_bound。接着遍历输入序列中的每一个数据点:如果某个数据点不在设定的数据范围之内,则判定其为异常观测点,并记录其在原始序列中的位置索引。最终输出所有位于范围外的数据点对应的索引位置。
执行以下代码后会生成一个包含100个元素的一维数组;随后调用detect_outliers()函数来识别这些异常值;输出其发生概率。考虑到这些数值近似服从标准正态分布;这表明在大多数情况下该算法能够有效地识别所有离群点。
4.3 特征工程
特征工程是一种涉及对原始数据进行转换、清洗和整理的操作序列,旨在生成适用于训练模型的数据集.Pandas提供了丰富的工具来支持这一过程,其中包括分组聚合功能以及重命名和重塑操作.
(1)分组聚合
在数据预处理过程中是一种常用手段,在机器学习和数据分析中具有重要作用。分组聚合(Data Grouping 和 Data Aggregation)也是一种可选的方法,在Pandas库中提供了groupby()方法来实现这一功能。通过groupby()方法可以根据指定列对数据集进行分组处理,并应用聚合函数来汇总各组的数据信息。
import numpy as np
import pandas as pd
# 生成测试数据集
np.random.seed(1)
data = {
"Country": ["China", "USA", "Japan", "Korea", "China"],
"Year": [2015, 2015, 2016, 2015, 2016],
"Population": [1393, 331, 1254, 512, 1393]
}
df = pd.DataFrame(data)
print("Original dataset:")
print(df)
# 分组聚合操作
grouped = df.groupby(["Country"])["Population"].sum().reset_index()
print("\nGroup by Country and sum population:")
print(grouped)
代码解读
该代码生成了一个测试数据集,并包含了国家、年份和人口数据。为了便于后续分析,我们按年份将数据进行了分组,并计算各组的人口总和。通过调用groupby()方法,并指定'Country'列为分组依据即可完成数据的分组。随后并输入'Population'列以及sum()函数作为聚合函数,并调用reset_index()方法以恢复索引设置为正常列。
(2)重命名
Renaming(renaming)是指从现有数据集中重新定义列名的过程,并且能够方便后续的数据处理流程。Pandas支持了rename()方法,并能实现对列名称的修改。
Renaming(renaming) 是指从现有数据集中重新定义列名的过程,并且能够方便后续的数据处理流程。 Pandas 支持了 rename() 方法,并能实现对列名称的修改。
import numpy as np
import pandas as pd
# 生成测试数据集
np.random.seed(1)
data = {"Old Column Names": np.arange(5),
"New Column Names": list('abcde')}
df = pd.DataFrame(data)
print("Original dataframe:\n")
print(df)
# 对列名称进行重命名
new_names = {"Old Column Names": "New Columns"}
df = df.rename(columns=new_names)
print("\nRename column names:\n")
print(df)
代码解读
该代码生成了一个测试数据集, 其中包含两列, 分别为旧列名与新列名。通过调用rename()方法, 并传递参数\\{\\{\\texttt{Old} \\texttt{Column} \\texttt{Names}\\}\\::\\:\\{\\texttt{New} \\texttt{Column} \\texttt{Names}\\}\\}, 即可实现对\\texttt{Column}名称的重命名。
(3)重塑
重塑(Reshaping)是指重新排列数据集的维度从而改变了数据的矩阵布局。Pandas通过提供melt()方法能够将数据框从宽表形式转换为长表形式。
import pandas as pd
# 生成测试数据集
data = {"key": ["A", "B", "C", "D", "E"],
"var1": [1, 2, 3, 4, 5],
"var2": [6, 7, 8, 9, 10]}
df = pd.DataFrame(data).set_index(['key'])
print("Original dataframe:\n")
print(df)
# 重塑操作
new_df = pd.melt(df, id_vars=['key'], value_vars=['var1', 'var2'])
print("\nReshape dataframe:\n")
print(new_df)
代码解读
该代码生成一组测试数据,并包含两个变量:var1和var2;此外还包含一个索引字段key。我们的目标是将此数据转换为长格式;即将所有变量名称与对应值统一放置于同一列中。通过调用 melt() 方法即可实现此目的;其中id_vars参数指定需要聚合汇总的字段;而value_vars参数则用于指定需要分解拆分的字段。
