0

0

Polars中基于条件替换NaN值:从另一列获取值的教程

DDD

DDD

发布时间:2025-11-02 13:56:01

|

806人浏览过

|

来源于php中文网

原创

Polars中基于条件替换NaN值:从另一列获取值的教程

本文详细介绍了在polars数据框中如何根据某一列的nan(或null)值,使用同一数据框中另一列的值来替换目标列中的数据。通过对比pandas的实现方式,深入讲解了polars中`pl.when().then().otherwise()`表达式的用法,提供了清晰的示例代码和解释,帮助用户高效地进行条件数据替换。

在数据处理和清洗过程中,根据特定条件替换数据框(DataFrame)中的值是一项常见任务。特别是当需要处理缺失值(NaN或null)时,我们可能希望用数据框中其他列的有效数据来填充这些缺失值。本教程将重点介绍如何在Polars这一高性能数据处理库中实现这一功能,并与Pandas的实现方式进行对比,以便于用户更好地理解和迁移。

场景描述

假设我们有一个数据框,其中包含三列:col_x、col_y和col_z。我们的目标是:如果col_x中的值为NaN(或null),则将对应行col_y的值替换为col_z中的值;如果col_x不为NaN,则保持col_y的原有值不变。

Pandas实现方式回顾

在Pandas中,实现这种条件替换通常有多种方法,其中一种常见且直观的方式是使用df.loc结合布尔索引,或者使用np.where:

import pandas as pd
import numpy as np

# 示例数据
data = {
    'col_x': [1.0, np.nan, 3.0, np.nan, 5.0],
    'col_y': [10, 20, 30, 40, 50],
    'col_z': [100, 200, 300, 400, 500]
}
df_pandas = pd.DataFrame(data)
print("原始 Pandas DataFrame:")
print(df_pandas)

# 使用 df.loc 进行条件替换
# df_pandas.loc[df_pandas['col_x'].isna(), 'col_y'] = df_pandas['col_z']

# 更简洁的 np.where 方法
df_pandas["col_y"] = np.where(pd.isnull(df_pandas['col_x']), df_pandas['col_z'], df_pandas['col_y'])

print("\n替换后的 Pandas DataFrame:")
print(df_pandas)

上述Pandas代码中,np.where函数会根据第一个条件(pd.isnull(df_pandas['col_x']))判断,如果为真,则取第二个参数的值(df_pandas['col_z']),否则取第三个参数的值(df_pandas['col_y'])。

Moshi Chat
Moshi Chat

法国AI实验室Kyutai推出的端到端实时多模态AI语音模型,具备听、说、看的能力,不仅可以实时收听,还能进行自然对话。

下载

Polars实现方式

Polars作为一个高性能的DataFrame库,其操作通常基于表达式(expressions)进行,这使得代码更具声明性且执行效率更高。实现上述条件替换的核心是使用pl.when().then().otherwise()结构。

import polars as pl

# 示例数据
data = {
    'col_x': [1.0, None, 3.0, None, 5.0], # Polars中通常使用None表示null,但浮点列的NaN也可用.is_nan()检测
    'col_y': [10, 20, 30, 40, 50],
    'col_z': [100, 200, 300, 400, 500]
}
df_polars = pl.DataFrame(data)
print("原始 Polars DataFrame:")
print(df_polars)

# 使用 pl.when().then().otherwise() 进行条件替换
df_polars = (
    df_polars
    .with_columns(
        pl.when(pl.col('col_x').is_null()) # 判断 col_x 是否为 null (对于浮点数NaN也适用)
        .then(pl.col('col_z'))             # 如果为 null,则取 col_z 的值
        .otherwise(pl.col('col_y'))        # 否则,保持 col_y 的原有值
        .alias('col_y')                    # 将结果重命名回 col_y
    )
)

print("\n替换后的 Polars DataFrame:")
print(df_polars)

代码解析

  1. df_polars.with_columns(...): 在Polars中,对DataFrame进行列操作通常通过with_columns()方法完成。这个方法会返回一个新的DataFrame,其中包含了修改或新增的列。
  2. pl.when(pl.col('col_x').is_null()): 这是条件表达式的开始。
    • pl.col('col_x'):选择名为col_x的列。
    • .is_null():这是一个表达式方法,用于检查列中的每个元素是否为null。对于浮点数类型,它也能正确识别NaN值。如果列中可能只有NaN而没有None,也可以使用.is_nan()。
  3. .then(pl.col('col_z')): 如果when中的条件为真(即col_x为null),则表达式的结果将是col_z列对应行的值。
  4. .otherwise(pl.col('col_y')): 如果when中的条件为假(即col_x不为null),则表达式的结果将是col_y列对应行的原有值。这一步至关重要,它确保了只有满足条件的行才会被替换,其他行保持不变。
  5. .alias('col_y'): 最后,使用.alias('col_y')将这个新生成的列重命名为col_y。由于with_columns会替换同名列,这样就实现了对col_y的“原地”更新。

注意事项与最佳实践

  • Null与NaN: 在Polars中,is_null()方法通常能够处理各种类型的缺失值,包括整数列的None、字符串列的None以及浮点数列的NaN。如果仅需针对浮点数类型的NaN进行判断,可以使用is_nan()。
  • 表达式驱动: Polars的操作是基于表达式的,这意味着你构建的是一个操作的“计划”,而不是立即执行。这使得Polars能够进行优化,从而提供出色的性能。
  • 链式操作: Polars鼓励使用链式操作(method chaining),使代码更易读、更流畅。
  • 不可变性: Polars的许多操作(如with_columns)都返回一个新的DataFrame,而不是修改原始DataFrame。这与Pandas中的某些原地修改操作有所不同,但有助于避免副作用和提高代码的预测性。

总结

通过pl.when().then().otherwise()表达式,Polars提供了一种强大而灵活的方式来处理基于条件的列值替换。这种模式不仅适用于替换缺失值,还可以用于实现各种复杂的条件逻辑。掌握这一结构是高效使用Polars进行数据清洗和转换的关键。与Pandas的np.where或df.loc相比,Polars的表达式方式在处理大规模数据时通常能展现出更好的性能。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

49

2025.12.04

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

229

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

434

2024.03.01

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

248

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

205

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1435

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

609

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

547

2024.03.22

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号