1. 引言
数据分析能力是高等院校在培养数据人才时一项很重要的参考指标,大数据时代已经到来,大数据的典型特点是数据海量和数据处理流程复杂,这对学生的数据分析能力提出了更高的要求,目前,Python凭借简单易学、功能强大、高可扩展性等特点,已经成为数据分析教学上的首选工具。为了满足时代发展的需要和提高学生解决实际问题的能力,各大高校陆续开设了Python语言的基础教学课程,然而,传统的程序设计教学中主要教授理论知识,忽略了对学生应用程序语言解决实际问题能力的培养,不适合新背景下Python语言基础的教学 [1]。为了让学生更加深刻的掌握Python语言基础的教学,激发学生用Python进行数据分析的学习兴趣,教师在进行教学时使用一系列实际例子是很有必要的。在教学领域,刘青云等进行了Python交叉融合案例教学实践,激发了学生使用Python进行数据分析的兴趣 [2];董付国作为多本Python教材的编写者,为Python教学提供了丰富的教学资源和应用实例 [3]。总体来说,Python教学一般是理论与案例结合,因此,本文将以某超市数据为例,将数据预处理的相关知识融入到教学实例中,对超市数据进行相应的数据预处理,展示数据预处理的基本流程,让学生逐渐掌握如何用Python对数据进行初步处理。
2. 数据预处理概述
目前,在各领域都存在数据分析需求,对于数据分析而言,数据是显而易见的核心,但是并不是所有的数据都是有用的,大多情况下数据是不完整的、不一致的、极易受到噪声影响的,这会给后面的数据分析带来很大的麻烦,所以有必要进行数据预处理 [4]。数据预处理是指对所收集的数据进行分类或分组前所做的审核、筛选、排序等必要的处理,接下来将从以下五个方面进行介绍。
2.1. 重复值的处理
当记录失误时,可能会导致存在重复数据,数据集中的重复值包括以下两种情况:1) 数据值完全相同的多条数据纪录;2) 数据主体相同但匹配到的唯一属性值不同。
2.2. 缺失值的处理
由于人为失误或机器故障的缘故,可能会导致某些数据丢失,在数据分析时应注意检查有没有缺失的数据如果有则将其删除或替换为特定的值,以减少对最终数据分析结果的影响 [5]。
2.3. 异常值的处理
异常值是指严重超出正常范围的数值,这样的数据一般是数据采集错误或类似的原因造成的,在数据分析时,需要把这些数据删除或者替换为特定的值(例如认为设定的正常范围边界值),减少对最终数据分析结果的影响 [6]。异常值处理的关键是根据实际情况准确定义正常范围边界值,超出正常范围的数值认为是异常值。
2.4. 查看数据特征和统计信息
在分析数据时,有时需要查看数据的数量、平均值、标准差、最大值、最小值、四分位数等特征,pandas对于这些操作都提供了良好的支持。
2.5. 数据的标准化处理
不同特征之间往往具有不同的量纲,由此所造成的数值之间的差异可能很大,为了消除特征之间的量纲和取值范围差异可能会造成的影响,需要对数据进行标准化处理。
3. 数据预处理实例——以超市数据为例
本文以某超市销售数据为例来进行数据预处理,该数据包含工号、姓名、日期、时段、交易额、柜台这六个特征,日期范围从2019年3月1日至2019年3月31日。使用pandas对超市数据进行数据清洗修复,对修复后的数据进行统计分析,利用处理后的数据做进一步的分析。
3.1. 重复值的处理
当存在重复数据的时候,一般采取的处理方法是直接丢弃重复数据。Python中的duplicated()可以用来检测哪些行是重复的,其语法格式为:duplicated(subset=None,keep=’frist’)。其中第一个参数subset对应值是列名,将列对应值相同的行进行去重,默认值None,即考虑所有列;第二个参数keep=’frist’表示除了第一次出现外,其余相同的值被标记为重复。本文首先查找重复行,一共有一条数据重复,然后查找一个人同时负责多个柜台的排班,得到表1,可以得到,该超市排班分配存在不合理的情况。代码为:
print(df[df.duplicated()])
dff3=df[['工号','姓名','日期','时段']]
dff3=dff3[dff3.duplicated()]
for row in dff3.values:
print(df[(df.工号==row[0])&(df.日期==row[2])&(df.时段==row[3])])

Table 1. One person is responsible for the scheduling of multiple counters at the same time
表1. 一个人同时负责多个柜台的排班
3.2. 缺失值的处理
Python中使用dropna()丢弃带有缺失值的数据行,或者使用fillna()方法对缺失值进行批量替换。本文原始数据有249行,有3行数据缺失,用每人交易额的均值来替换缺失值,得到表2。代码为:
print(len(df))
print(len(df.dropna())
dff=deepcopy(df)
for i in dff[dff.交易额.isnull].index;
dff.loc[i,’交易额’]=round(dff.loc[dff.姓名==dff.loc[i,’姓名’],’交易额’].mean()
print(dff.iloc([110,124,168,;])

Table 2. Replace missing values with the average transaction value per person
表2. 使用每人交易额均值替换缺失值
上述代码中,主要使用dropna(axis=0, how=‘any’, thresh=None, subset=None, inplace=False)函数,其中第一个参数axis=0表示删除带有缺失值的行,axis=1表示删除带有缺失值的列;第二个参数how=‘any’表示删除只要含有缺失值的行(列),how=‘all’表删除全是缺失值的行(列);第三个参数thresh表示非空元素最低数量,若该行(列)中,非空元素数量小于这个值,就删除该行(列);第四个参数subset表示行(列)的索引;第五个参数inplace表示是否在原DataFrame上进行修改。
3.3. 异常值的处理
异常值的处理有以下几种方法:
1) 删除:先将异常值替换为Na,然后使用dropna()删除。
2) 视为缺失值:先将异常值替换为Na,然后用缺失值的方法处理(填充、插值等)。
3) 平均值修正:如果数据量较小,也可以用前后两个观测值的平均值修正该异常值。
本文首先筛选出交易额小于200的数据,如表3,一共有三条数据。然后筛选出交易额大于3000的数据,如表4,一共有两条数据,最后使小于200的交易额等于200,大于3000的交易额等于3000。代码为:
df.loc[df.交易额<200交易额]=200
df.loc[df.交易额>3000交易额]=3000

Table 3. Data on transactions with transactions of less than 200
表3. 交易额小于200的数据

Table 4. Data on transactions greater than 3000
表4. 交易额大于3000的数据
Pandas有两个主要的数据结构:Series和DataFrame,其中Series是带标签的一维数组,DataFrame是一个二维结构,DataFrame中提供了loc、iloc、at、iat等访问器来访问指定的数据。其中,iloc和iat使用整数来指定行、列的下标,而loc和at使用标签来指定要访问的行和列,使用这些操作能够快速的查找到需要的行和列。
3.4. 查看数据特征和统计信息
对交易额进行汇总类统计,得到表5,可以得出,该超市在这一时间段交易额的均值为1330.3130,找出交易额最小的3条记录,如表6所示,可以得到,交易额的最小值为53.0,代码为:
df['交易额'].describe()
df.nsmallest(3,'交易额')

Table 5. Summary statistics on transaction value
表5. 交易额的汇总统计

Table 6. The 3 records with the minimum transaction value
表6. 交易额最小的3条记录
3.5. 数据的标准化处理
数据标准化操作是将数据按比例缩放,使之落入一个小的特定区间,用pandas模块实现数据标准化主要有以下方法:
1) 离差标准化:(x − min)/(max − min),这是对原始数据的一种线性变换,结果是将原始数据的数值映射到[0, 1]区间上。
2) 标准差标准化:(x − μ)/δ。
3) 小数定标标准化:x/10**k,k=np.ceil(log10(max(|x|)),这是将数据映射到[−1, 1]区间上,移动的小数位数取决于数据绝对值的最大值。代码为:
def minmaxscale(data):
data=(data-data.min())/(data.max()-data.min())
return data
data1=minmaxscale(df['交易额'])
data1.head()
def standardscaler(data):
data=(data-data.mean())/data.std()
return data
data2=standardscaler(df['交易额'])
data2.head()
标准化后前5行的结果如表7,由表可知,这三种标准化处理的结果有所区别,其中离差标准化是将数据进行线性变换,但是过大或者过小的异常值都会对结果产生影响,离差标准化是消除量纲影响最简单的方法;标准差标准化后的数据符合标准正态分布,适用于本身服从正态分布的数据;小数定标标准化后的数据分布规律不变,适用于数据分布比较分散,尤其是数据分布多个数量级的情况。
4. 结语
本文利用pandas对某超市的销售数据进行了异常值处理、重复值处理等操作,pandas是一款基于numpy、专门为了解决数据分析任务的工具,其提供了大量标准数据模型,具有高效操作大量数据集所需要的功能 [7]。目前,在各个领域都存在数据分析需求,pandas提供了大量函数和对象方法来支持这些操作,可以说,pandas是使Python能够成为高效且强大的数据分析行业首选语言的重要因素之一。数据预处理是数据分析的第一步,在数据分析中占有重要地位。通过在Python语言基础教学过程中贯穿数据预处理案例,结合各个知识点的综合应用分析讲解演示,不仅能够加深学生对理论知识的理解,还能提高学生运用所学知识解决复杂数据问题的能力 [8]。同时,以案例为依托的研讨式教学也对教师的专业能力提出了更高的要求,研讨式教学极大地提高了学生的自主性,教师与学生一起努力,共同完成整个教学过程。由于数据分析广阔的应用前景,可能会有来自其他专业的学生进行Python基础课程学习,让不同学习背景的学生掌握数据分析的基础入门知识,是我们的挑战,我们将为之不断的努力。