开发者

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

开发者 https://www.devze.com 2026-01-07 09:16 出处:网络 作者: 杰瑞不懂代码
价值2999元 Java视频教程限时免费下载
专为Java开发者设计,涵盖核心技术、架构设计、性能优化等
立即下载
目录一、如何对DataFrame新增列1.1 直接运算实现1.2 Apply方法增加列1.3 Assign方法1.3 通过条件语句进行新增列二、pandas常见的数据统计类型2.1 数据特征统计2.2 数据去重和分类汇总三、pandas对缺失值的处理3.1 判
目录
  • 一、如何对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 文件,来进行本节课的演示,数据如下:

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

    一、如何对DataFrame新增列

    1.1 直接运算实现

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

    print(df.head(3))
    df.loc[:,"业绩总分"] = df["销售数量"] * df["客户评分"]
    print("="*60)
    print(df.head(3))
    

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

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

    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,代表为行,其实打印出来就发现

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

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

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

    1.3 Assign方法

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

    # 第一种写法
    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.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

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

    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    175

    A    147

    B    146

    D    138

    Name: count, dtype: int64

    ============================================================

    ['西南&www.devze.com#39; '华东' '西北' '华北' '华南' '华中']

    地区

    华东    102

    西南    101

    华北    101

    华南    101

    华中    101

    西北    100

    Name: count, dtype: int64

    三、pandas对缺失值的处理

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

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

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

    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.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才是对整个区域的缺失值求和

    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,否则不替换
    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,否则不替换
    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的索引列也写回。

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

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

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

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

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

    • apply 方法,结合lambda函数,取出字典中的值,然后写回
    • applymap 方法,遍历整个DataFrame,发现有符合的键,则进行相应的值替换,但是需要注意此方法只适用于DataFrame
    • map 方法,既可以支持DataFrame 又可以支持Series
    • replace 方法,取出对应的列索引,然后进行字典替换
    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    50

    1  John    A     24     4

    2  Jane    B     38     2

    ==============================

       name area  sp编程end  perf

    0  Jane  区域A     54    50

    1  John  区域A     24     4

    2  Jane  区域B     38     2

    到此这篇关于一文带你掌握Python Pandas数据处理的三大实用技巧的文章就介绍到这了,更多相关Python Pandas数据处理内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

    0
    价值2999元 Java视频教程限时免费下载
    专为Java开发者设计,涵盖核心技术、架构设计、性能优化等
    立即下载

    精彩评论

    暂无评论...
    验证码 换一张
    取 消