目录
- 一、如何对DataFrame新增列
- 1.1 直接运算实现
- 1.2 Apply方法增加列
- 1.3 Assign方法
- 1.3 通过条件语句进行新增列
- 二、pandas常见的数据统计类型
- 2.1 数据特征统计
- 2.2 数据去重和分类汇总
- 三、pandas对缺失值的处理
- 3.1 判断是否为空值
- 3.2 丢弃空行空列
- 3.3 空值填充
- 附录:Apply,Map,ApplyMap的使用差异
同样我们使用上节课的 DATA.xlsx 文件,来进行本节课的演示,数据如下:

一、如何对DataFrame新增列
1.1 直接运算实现
我们新增一个“业绩总分” 列,为“销售数量” 乘以 “客户评分”
print(df.head(3))
df.loc[:,"业绩总分"] = df["销售数量"] * df["客户评分"]
print("="*60)
print(df.head(3))
输出如下,可以发现运算过后,最后多了一列业绩总分,也就是成功新增了一列:

1.2 Apply方法增加列
apply方法的直接使用用法是这样,这里我们通过performance函数接受df,然后进行判断,根据不同的安全等级划分性能
def performance(df):
if df["安全等级"] == "A" or df["安全等级"] == "B":
return "好"
elif df["安全等级"] == "C" or df["安全等级"] == "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()方法统计一下结果:
print(df["性能"].value_counts()) # 统计不同性能情况的个数
如果python基础好的话,还可以通过推导式,简化一下函数的写法:
df["性能"] = df["安全等级"].apply(lambda x: "好" if x in ["A","B"] else "一般")
同时发现apply方法有一个axis参数,表示传入进来的df是按行,还是按列,如果为1,代表为行,其实打印出来就发现

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

1.3 Assign方法
同时我们也可以使用Assign方法得到一样的结果,下面不管是 map 还是多加的[ ],都是为了将数据一行一行取出来,具体map和apply 这些方法怎么用,我会在最后一节,附录中给出来
# 第一种写法 df = df.assign(性能 = df["安全等级"].map(lambda x: "好" if x in ["A", "B"] else "一般")) # 第二种写法 df = df.assign(性能 = lambda x: ["好" if x in ["A", "B"] else "一般" for x in df["安全等级"]]) 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["性能"] = "" 初始化一个空列,然后依次赋值,可以得到一样的结果:
df["性能"] = "" # 先初始化一个空列 df.loc[df["安全等级"].isin(["A","B"]),"性能"] = "好" df.loc[df["安全等级"].isin(["C","D"]),"性能"] = "一般" print(df.head(3))
二、pandas常见的数据统计类型
2.1 数据特征统计
pandas提供了非常强大的数据统计功能,比如去重,计数以及对数据特征做汇总,比如我们先简单使用这样一句代码:
print(df.describe()) # 描述性统计
描述性统计用于数据中的数值列计数,求平均值,标准差,最小最大值和各个分位数
销售额(元) 销售数量 客户评分
count 606.000000 606.000000 606.000000mean 1381.760479 7.120462 4.327723std 868.101509 3.309942 0.390114min 345.600000 2.000000 3.50000025% 745.600000 5.000000 4.00000050% 987.600000 6.000000 4.30000075% 1876.400000 8.000000 4.600000max 4567.900000 21.000000 5.000000
当然如果你只想要查看某个字段的具体指标的话,可以通过单独打印实现:
print(df["销售额(元)"].max()) # 最大销售额 print(df["销售额(元)"].min()) # 最小销售额 print(df["销售额(元)"].mean()) # 平均销售额 print(df["销售额(元)"].median()) # 中位数销售额 print(df[["销售额(编程客栈元)","销售数量"]].cov()) # 协方差矩阵 print(df[["销售额(元)","销售数量"]].corr()) # 相关系数矩阵
2.2 数据去重和分类汇总
通过 unique方法 我们能拿到去重之后的结果,返回的是一个列表,而通过 value_counts 我们能拿到各个子类的结果
print(df["安全等级"].unique())
print(df["安全等级"].value_counts())
print("="*60) # 分割线
print(df["地区"].unique())
print(df["地区"].value_counts())
输出的结果如下:
['C' 'A' 'D' 'B']
安全等级C 175A 147B 146D 138Name: count, dtype: int64============================================================['西南&www.devze.com#39; '华东' '西北' '华北' '华南' '华中']地区华东 102西南 101华北 101华南 101华中 101西北 100Name: count, dtype: int64
三、pandas对缺失值的处理
我们有一个这样的EXCEL文件,名为 DATA_part.xlsx,如图所示,这个数据很不规范,有以下几个典型特征:
- A1单元格为空,真正的数值前有空行空列
- 存在合并单元格
- 数据源中也存在空行

3.1 判断是否为空值
首先我们读取这个EXCEL,使用skiprows 跳过第一行
file_path = r"C:\Users\22330\Desktop\进行中\DATA_part.xlsx" df = pd.read_ejavascriptxcel(file_path,skiprows=1) # 跳过第一行
得到如下的结果,可以发现没有填充数据的部分都是NaN,因此我们需要对数据进行清洗
Unnamed: 0 产品经理 地区 销售数量 客户评分
0 NaN Jerry 西南 12.0 5.01 NaN NaN 华东 14.0 5.02 NaN NaN 西北 7.0 3.73 NaN NaN NaN NaN NaN4 NaN Cary 西南 17.0 NaN5 NaN 编程客栈 NaN 华东 19.0 10.06 NaN NaN 西北 12.0 8.77 NaN Bob-Smith 西南 15.0 8.08 NaN NaN 华东 17.0 8.09 NaN NaN 西北 10.0 6.7
首先我们通过isnull来判断是否是空值,注意两层sum才是对整个区域的缺失值求和
print(df.isnull()) # 打印缺失值
print("="*60) # 分割线
print(df.isnull().sum()) # 查看缺失值数量
print("="*60) # 分割线
print(df.isnull().sum().sum()) # 查看缺失值总数
得到如下结果:
Unnamed: 0 产品经理 地区 销售数量 客户评分
0 True False False False False1 True True False False False2 True True False False False3 True True True True True4 True False False False True5 True True False False False6 True True False False False============================================================Unnamed: 0 7产品经理 5地区 1销售数量 1客户评分 2dtype: int64============================================================16
同样如果我们需要统计非空值,那就使用notnull方法。
3.2 丢弃空行空列
在这里我们需要使用dropna方法,里面主要有三个参数:
axis=1, 代表按列方向,axis=0, 代表按行方向how="all"代表这个维度所有的为空才删除,how="any"代表只要有空值就删除inplace=True代表替换原来的DataFrame,否则不替换
df.dropna(axis=1,how="all",inplace=True) # 按列删除缺失值 df.dropna(axis=0,how="all",inplace=True) # 按行删除缺失值
执行以上过程后,得到稍微干净一点的数据:
产品经理 地区 销售数量 客户评分
0 Jerry 西南 12.0 5.01 NaN 华东 14.0 5.02 NaN 西北 7.0 3.74 Cary 西南 17.0 NaN5 NaN 华东 19.0 10.06 NaN 西北 12.0 8.7
3.3 空值填充
接下来我们就需要对剩余的空值进行处理,规范的DataFrame其实就是行和列每个位置都有有效的数据,因此我们通过fillna方法将其进行填充,其重要的主要有3个参数:
value, 代表你要将空值填为什么,比如对于客户评分列就很适合这种填充method="ffill"代表用空值之前的内容填充,比如产品经理列就很适合,同样bfill代表用空值后续的值填充inplace=True代表替换原来的DataFrame,否则不替换
df["客户评分"].fillna(value=0,inplace=True) # 填充缺失值 df["产品经理"].fillna(method="ffill",inplace=True) # 填充缺失值
经过这样处理之后,得到的结果为:
产品经理 地区 销售数量 客户评分
0 Jerry 西南 12.0 5.01 Jerry 华东 14.0 5.02 Jerry 西北 7.0 3.74 Cary 西南 17.0 0.05 Cary 华东 19.0 10.06 Cary 西北 12.0 8.7
这样子我们再直接写到另一个工作簿,就非常完美了,但是要注意使用index=False,防止将DataFrame的索引列也写回。
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,发现有符合的键,则进行相应的值替换,但是需要注意此方法只适用于DataFramemap方法,既可以支持DataFrame又可以支持Seriesreplace方法,取出对应的列索引,然后进行字典替换
import pandas as pd
import numpy as np
import random
np.random.seed(42) # 固定随机数种子
random.seed(42)
df = pd.DataFrame({
"name":np.random.choice(["John","Doe","Jane"],20),
"area":np.random.choice(["A","B","C"],20),
"spend":np.random.randint(18,60,20),
"perf":np.random.randint(1,100,20)
})
print(df.head(3))
print("="*30)
map_dict = {"A":"区域A","B":"区域B","C":"区域C"}
df["area"] = df["area"].apply(lambda x:map_dict[x]) # 采用apply方法进行替换
df = df.applymap(lambda x:map_dict[x] if x in map_dict else x) # 使用applymap方法进行替换
# df["area"] = df["area"].applymap(lambda x:map_dict[x]) # 这样写是错的,applymap只能对DataFrame生效
df["area"] = df["area"].map(map_dict) # 使用map方法进行替换,对Series进行替换
df = df.map(lambda x:map_dict[x] if x in map_dict else x) # 对整个DataFrame进行替换
df = df.replace({"area":map_dict}) # 采用replace方法替换area列的A、B、C
print(df.head(3))
上述几种方法得到的结果都是,实现了对指定列的替换:
name area spend perf
0 Jane A 54 501 John A 24 42 Jane B 38 2============================== name area sp编程end perf0 Jane 区域A 54 501 John 区域A 24 42 Jane 区域B 38 2
到此这篇关于一文带你掌握Python Pandas数据处理的三大实用技巧的文章就介绍到这了,更多相关Python Pandas数据处理内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
加载中,请稍侯......
精彩评论