Python Pandas数据清洗实战:合并、转换、过滤与排序详解

Evan
Evan
发布时间:2026-10-13 | 3人浏览过
原创

本文深入讲解Python Pandas库在数据清洗中的核心操作。涵盖merge函数的多种连接方式(inner, outer, left, right)及列名指定;介绍combine_first处理重叠数据的方法;详解数据重塑与轴向旋转;演示删除重复行、替换值及分段统计(cut/qcut);最后解析随机排列与采样技巧,助力高效数据预处理。

此前我们已介绍了Pandas的基础操作,本文将进一步深入探讨数据处理的进阶技巧。数据清洗作为数据分析流程中至关重要的一环,其质量直接决定了后续分析结果的可靠性。

数据合并

在Pandas库中,可以使用merge函数来实现不同数据源之间的合并操作。

import numpy as np
import pandas as pd
data1 = pd.DataFrame({'level':['a','b','c','d'],
         'numeber':[1,3,5,7]})

data2=pd.DataFrame({'level':['a','b','c','e'],
         'numeber':[2,3,6,10]})
print(data1)

执行结果如下:

print(data2) 

输出结果为:

print(pd.merge(data1,data2)) 

最终输出为:


观察上述结果可知,data1和data2中拥有相同标签的字段被保留显示,而其他不匹配的字段则被舍弃。这一行为逻辑等同于SQL语句中的inner join(内连接)操作。此外,Pandas还支持outer(外连接)、right(右连接)和left(左连接)等多种连接模式,这些均通过how参数进行指定。

data3 = pd.DataFrame({'level1':['a','b','c','d'],
         'numeber1':[1,3,5,7]})
data4=pd.DataFrame({'level2':['a','b','c','e'],
         'numeber2':[2,3,6,10]})
print(pd.merge(data3,data4,left_on='level1',right_on='level2'))

运行结果如下:


当两个数据框的列名不一致时,可以通过指定left_on和right_on参数,明确指定用于连接的列,从而将数据成功连接在一起。

print(pd.merge(data3,data4,left_on='level1',right_on='level2',how='left')) 

执行结果如下:

关于该函数的其他详细参数说明,请参考官方文档。

重叠数据合并

在实际场景中,有时会遇到数据重叠需要合并的情况。此时,可以使用combine_first函数来处理此类问题。

data3 = pd.DataFrame({'level':['a','b','c','d'],
         'numeber1':[1,3,5,np.nan]})
 data4=pd.DataFrame({'level':['a','b','c','e'],
         'numeber2':[2,np.nan,6,10]})
 print(data3.combine_first(data4))

运行结果如下:


从结果可以看出,在相同标签下,系统优先显示data3的内容。如果某个数据框中的特定数据存在缺失值(NaN),另一个数据框中对应的元素便会自动填补空缺。

这种用法在逻辑上类似于np.where(isnull(a), b, a)的条件判断表达式。

数据重塑和轴向旋转

这一部分内容在之前的Pandas文章中也曾提及。数据重塑主要依赖于reshape函数,而轴向旋转则主要通过unstack和stack两个函数来实现。

data=pd.DataFrame(np.arange(12).reshape(3,4),
       columns=['a','b','c','d'],
       index=['wang','li','zhang'])
print(data)

运行结果如下:

print(data.unstack()) 

输出结果为:

数据转换

删除重复行数据

data=pd.DataFrame({'a':[1,3,3,4],
       'b':[1,3,3,5]})
print(data)

运行结果如下:

print(data.duplicated()) 

最终输出为:


分析结果可见,第三行数据与第二行完全重复,因此对应的布尔值为True。

另外,还可以使用drop_duplicates方法来直接去除重复的行数据。

print(data.drop_duplicates()) 

运行结果如下:

替换值

除了前文提到的fillna方法外,还可以使用replace方法进行值替换,这种方式通常更加简单快捷。

data=pd.DataFrame({'a':[1,3,3,4],
       'b':[1,3,3,5]})
print(data.replace(1,2))

运行结果如下:


实现多个值的批量替换

print(data.replace([1,4],np.nan)) 

数据分段

data=[11,15,18,20,25,26,27,24]
bins=[15,20,25]
print(data)
print(pd.cut(data,bins))

运行结果如下: [11, 15, 18, 20, 25, 26, 27, 24][NaN, NaN, (15, 20], (15, 20], (20, 25], NaN, NaN, (20, 25]] Categories (2, object): [(15, 20] < (20, 25]]

从分段结果可以看出,未落入指定分段区间的数据显示为NaN值,而落入区间的数据则显示其所属的分段标签。

print(pd.cut(data,bins).labels) 

运行结果如下:

输出结果为:[-1 -1 0 0 1 -1 -1 1]

显示所在分段的排序标签

print(pd.cut(data,bins).levels) 

运行结果如下:

Index([‘(15, 20]', ‘(20, 25]'], dtype='object')

显示所有分段的标签

print(value_counts(pd.cut(data,bins))) 

运行结果如下:


统计每个分段中数值的个数

此外,还有一个qcut函数可用于对数据进行四分位切割,其用法与cut函数类似。

排列和采样

我们知道排序有多种方法,例如sort、order、rank等函数均可对数据进行排序。这里要介绍的是对数据进行随机排序(permutation)的功能。

data=np.random.permutation(5)
print(data)

运行结果如下:

输出结果为:[1 0 4 2 3]

这里的permutation函数对0到4的数据进行了随机排序。此外,该功能也可用于数据采样。

df=pd.DataFrame(np.arange(12).reshape(4,3))
samp=np.random.permutation(3)
print(df)

运行结果如下:

print(samp)

最终输出为:[1 0 2]

print(df.take(samp))

运行结果如下:


使用take函数的结果是,按照samp指定的顺序从df中提取相应的样本数据。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表