当前位置: 首页 > news >正文

一文带你掌握Python Pandas数据处理的三大实用技巧

同样我们使用上节课的DATA.xlsx文件,来进行本节课的演示,数据如下:

一、如何对DataFrame新增列

1.1 直接运算实现

我们新增一个“业绩总分” 列,为“销售数量” 乘以 “客户评分

1

2

3

4

print(df.head(3))

df.loc[:,"业绩总分"]=df["销售数量"]*df["客户评分"]

print("="*60)

print(df.head(3))

输出如下,可以发现运算过后,最后多了一列业绩总分,也就是成功新增了一列:

1.2 Apply方法增加列

apply方法的直接使用用法是这样,这里我们通过performance函数接受df,然后进行判断,根据不同的安全等级划分性能

1

2

3

4

5

6

7

8

9

defperformance(df):

ifdf["安全等级"]=="A"ordf["安全等级"]=="B":

return"好"

elifdf["安全等级"]=="C"ordf["安全等级"]=="D":

return"一般"

# axis=1 表示一行一行处理数据, 如果是一列一列处理数据的话就是 axis=0

df.loc[:,"性能"]=df.apply(performance,axis=1)

print(df.head(3))

输出结果如下,可以看到通过apply方法,我们也成功增加了一列性能:

产品经理 产品类别 地区 安全等级 销售额(元) 销售数量 客户评分 性能
出库日期
2023-06-01 Jerry 电子产品 西南 C 3789.6 12 5.0 一般
2023-06-02 Cary 服装 华东 A 2345.3 14 5.0 好
2023-06-03 Bob-Smith 家居用品 西北 D 567.8 7 3.7 一般

还可以顺手通过value_counts()方法统计一下结果:

1

print(df["性能"].value_counts())# 统计不同性能情况的个数

如果python基础好的话,还可以通过推导式,简化一下函数的写法:

1

df["性能"]=df["安全等级"].apply(lambdax:"好"ifxin["A","B"]else"一般")

同时发现apply方法有一个axis参数,表示传入进来的df是按行,还是按列,如果为1,代表为行,其实打印出来就发现

结构其实是上面这样子,因此可以通过df["XXXX"]的形式取出来做判断,然后再返回一个结果,如果axis=0,那代表的就是按列传递,其实每此传递都是一列索引+一列数据的格式,这种情况下我们可以对每列的数据做分析,结构如下:

1.3 Assign方法

同时我们也可以使用Assign方法得到一样的结果,下面不管是map还是多加的[ ],都是为了将数据一行一行取出来,具体mapapply这些方法怎么用,我会在最后一节,附录中给出来

1

2

3

4

5

# 第一种写法

df=df.assign(性能=df["安全等级"].map(lambdax:"好"ifxin["A","B"]else"一般"))

# 第二种写法

df=df.assign(性能=lambdax: ["好"ifxin["A","B"]else"一般"forxindf["安全等级"]])

print(df.head(3))

因此我们可以得到结果是:

产品经理 产品类别 地区 安全等级 销售额(元) 销售数量 客户评分 性能
出库日期
2023-06-01 Jerry 电子产品 西南 C 3789.6 12 5.0 一般
2023-06-02 Cary 服装 华东 A 2345.3 14 5.0 好
2023-06-03 Bob-Smith 家居用品 西北 D 567.8 7 3.7 一般

1.3 通过条件语句进行新增列

在下面的代码中,我们先通过df["性能"] = ""初始化一个空列,然后依次赋值,可以得到一样的结果:

1

2

3

4

df["性能"]=""# 先初始化一个空列

df.loc[df["安全等级"].isin(["A","B"]),"性能"]="好"

df.loc[df["安全等级"].isin(["C","D"]),"性能"]="一般"

print(df.head(3))

二、pandas常见的数据统计类型

2.1 数据特征统计

pandas提供了非常强大的数据统计功能,比如去重,计数以及对数据特征做汇总,比如我们先简单使用这样一句代码:

1

print(df.describe())# 描述性统计

描述性统计用于数据中的数值列计数,求平均值,标准差,最小最大值和各个分位数

销售额(元) 销售数量 客户评分
count 606.000000 606.000000 606.000000
mean 1381.760479 7.120462 4.327723
std 868.101509 3.309942 0.390114
min 345.600000 2.000000 3.500000
25% 745.600000 5.000000 4.000000
50% 987.600000 6.000000 4.300000
75% 1876.400000 8.000000 4.600000
max 4567.900000 21.000000 5.000000

当然如果你只想要查看某个字段的具体指标的话,可以通过单独打印实现:

1

2

3

4

5

6

7

print(df["销售额(元)"].max())# 最大销售额

print(df["销售额(元)"].min())# 最小销售额

print(df["销售额(元)"].mean())# 平均销售额

print(df["销售额(元)"].median())# 中位数销售额

print(df[["销售额(元)","销售数量"]].cov())# 协方差矩阵

print(df[["销售额(元)","销售数量"]].corr())# 相关系数矩阵

2.2 数据去重和分类汇总

通过unique方法 我们能拿到去重之后的结果,返回的是一个列表,而通过value_counts我们能拿到各个子类的结果

1

2

3

4

5

print(df["安全等级"].unique())

print(df["安全等级"].value_counts())

print("="*60)# 分割线

print(df["地区"].unique())

print(df["地区"].value_counts())

输出的结果如下:

['C' 'A' 'D' 'B']
安全等级
C 175
A 147
B 146
D 138
Name: count, dtype: int64
============================================================
['西南' '华东' '西北' '华北' '华南' '华中']
地区
华东 102
西南 101
华北 101
华南 101
华中 101
西北 100
Name: count, dtype: int64

三、pandas对缺失值的处理

我们有一个这样的EXCEL文件,名为DATA_part.xlsx,如图所示,这个数据很不规范,有以下几个典型特征:

  • A1单元格为空,真正的数值前有空行空列
  • 存在合并单元格
  • 数据源中也存在空行

3.1 判断是否为空值

首先我们读取这个EXCEL,使用skiprows跳过第一行

1

2

file_path=r"C:\Users\22330\Desktop\进行中\DATA_part.xlsx"

df=pd.read_excel(file_path,skiprows=1)# 跳过第一行

得到如下的结果,可以发现没有填充数据的部分都是NaN,因此我们需要对数据进行清洗

Unnamed: 0 产品经理 地区 销售数量 客户评分
0 NaN Jerry 西南 12.0 5.0
1 NaN NaN 华东 14.0 5.0
2 NaN NaN 西北 7.0 3.7
3 NaN NaN NaN NaN NaN
4 NaN Cary 西南 17.0 NaN
5 NaN NaN 华东 19.0 10.0
6 NaN NaN 西北 12.0 8.7
7 NaN Bob-Smith 西南 15.0 8.0
8 NaN NaN 华东 17.0 8.0
9 NaN NaN 西北 10.0 6.7

首先我们通过isnull来判断是否是空值,注意两层sum才是对整个区域的缺失值求和

1

2

3

4

5

print(df.isnull())# 打印缺失值

print("="*60)# 分割线

print(df.isnull().sum())# 查看缺失值数量

print("="*60)# 分割线

print(df.isnull().sum().sum())# 查看缺失值总数

得到如下结果:

Unnamed: 0 产品经理 地区 销售数量 客户评分
0 True False False False False
1 True True False False False
2 True True False False False
3 True True True True True
4 True False False False True
5 True True False False False
6 True True False False False
============================================================
Unnamed: 0 7
产品经理 5
地区 1
销售数量 1
客户评分 2
dtype: int64
============================================================
16

同样如果我们需要统计非空值,那就使用notnull方法。

3.2 丢弃空行空列

在这里我们需要使用dropna方法,里面主要有三个参数:

  • axis=1, 代表按列方向,axis=0, 代表按行方向
  • how="all"代表这个维度所有的为空才删除,how="any"代表只要有空值就删除
  • inplace=True代表替换原来的DataFrame,否则不替换

1

2

df.dropna(axis=1,how="all",inplace=True)# 按列删除缺失值

df.dropna(axis=0,how="all",inplace=True)# 按行删除缺失值

执行以上过程后,得到稍微干净一点的数据:

产品经理 地区 销售数量 客户评分
0 Jerry 西南 12.0 5.0
1 NaN 华东 14.0 5.0
2 NaN 西北 7.0 3.7
4 Cary 西南 17.0 NaN
5 NaN 华东 19.0 10.0
6 NaN 西北 12.0 8.7

3.3 空值填充

接下来我们就需要对剩余的空值进行处理,规范的DataFrame其实就是行和列每个位置都有有效的数据,因此我们通过fillna方法将其进行填充,其重要的主要有3个参数:

  • value, 代表你要将空值填为什么,比如对于客户评分列就很适合这种填充
  • method="ffill"代表用空值之前的内容填充,比如产品经理列就很适合,同样bfill代表用空值后续的值填充
  • inplace=True代表替换原来的DataFrame,否则不替换

1

2

df["客户评分"].fillna(value=0,inplace=True)# 填充缺失值

df["产品经理"].fillna(method="ffill",inplace=True)# 填充缺失值

经过这样处理之后,得到的结果为:

产品经理 地区 销售数量 客户评分
0 Jerry 西南 12.0 5.0
1 Jerry 华东 14.0 5.0
2 Jerry 西北 7.0 3.7
4 Cary 西南 17.0 0.0
5 Cary 华东 19.0 10.0
6 Cary 西北 12.0 8.7

这样子我们再直接写到另一个工作簿,就非常完美了,但是要注意使用index=False,防止将DataFrame的索引列也写回。

1

df.to_excel(r"C:\Users\22330\Desktop\进行中\DATA_part_clean.xlsx",index=False)# 保存到新文件

我们打开保存之后的DATA_part_clean.xlsx文件,就发现清洗后的数据已经放在表格内了

附录:Apply,Map,ApplyMap的使用差异

在下面的案例中,我们需要将"A":"区域A","B":"区域B","C":"区域C"做一个一一替换,使用了四种不同的方式,都能得到最后的结果:

  • apply方法,结合lambda函数,取出字典中的值,然后写回
  • applymap方法,遍历整个DataFrame,发现有符合的键,则进行相应的值替换,但是需要注意此方法只适用于DataFrame
  • map方法,既可以支持DataFrame又可以支持Series
  • replace方法,取出对应的列索引,然后进行字典替换
http://www.jsqmd.com/news/648175/

相关文章:

  • 保姆级教程:从URDF模型到可运行的IKFast插件,一步步教你为MoveIt!加速运动学求解
  • 手把手复现RQ-VAE:用PyTorch从零搭建残差量化模块(附训练避坑指南)
  • 扩散模型高效采样新突破:基于渐进蒸馏的少步生成优化
  • NumPy 数组的复制的几种实现方法
  • Mysql--基础知识点--100-- insert VS select...for update 加锁
  • Ubuntu20.04编译Carla0.9.13实战:从环境配置到资源下载的完整避坑指南
  • Ubuntu系统中sogou输入法的安装与常见问题解决指南
  • EVA-01部署教程:Qwen2.5-VL-7B模型微调+领域适配(NERV战术语料)
  • 沟通力决定薪资:技术人的表达升级课
  • AI+Simulink新手避坑指南:从数据准备到模型部署的完整工作流
  • 硬件设计进阶:光耦在隔离驱动与信号转换中的实战解析
  • TLPI 第3章 练习:System Programming Concepts
  • 青少年软编等考五级题解目录
  • AutoSAR ETH Driver集成LwIP:Tc3XX平台下接收中断与发送缓冲区的配置与调试指南
  • 小红书博主必看:AI智能体如何5分钟搞定高颜值封面+3张内容页(附保姆级教程)
  • VPet存档迁移终极指南:如何快速升级旧版本数据到v2格式
  • python-gitlab CLI 工具深度解析:30个常用命令让 GitLab 管理变得简单
  • Ansible之Playbook(六):实例部署实战
  • MQTT over WebSocket实战指南:从EMQX安装到消息收发全流程
  • 该贴已作废
  • 告别深度依赖:手把手拆解BEVFormer如何用Transformer实现纯视觉BEV感知
  • 旋风分离器几何建模避坑指南:Star CCM+中布尔运算的5个常见错误
  • DeepSeek LeetCode 1434.每个个戴不同帽子的方案数 public int numberWays(List<List<Integer>> hats)
  • 从‘看图说话’到‘看截图答题’:MMMU-Pro如何模拟真实用户场景来‘拷问’AI?
  • Vue3 项目集成 OnlyOffice 在线编辑 + 自定义插件开发(一)
  • DeepSeek LeetCode 1439. 有序矩阵中的第 k 个最小数组和 public int kthSmallest(int[][] mat, int k)
  • Python 装饰器高级应用指南
  • 手把手教你用DigNet从scRNA-seq数据构建基因调控网络(附乳腺癌案例解析)
  • PyTorch 2.8镜像高清案例:Stable Video Diffusion生成电影级运镜视频截图
  • 玻璃幕墙的自爆原因,以及安全隐患分析