0

0

利用Pandas高效创建依赖上一个有效值的条件列

心靈之曲

心靈之曲

发布时间:2025-08-11 22:22:16

|

446人浏览过

|

来源于php中文网

原创

利用Pandas高效创建依赖上一个有效值的条件列

本文详细介绍了如何在Pandas DataFrame中高效地创建新列,使其值根据特定条件和相邻单元格进行填充。核心方法是结合使用Series.where()进行条件性赋值,以及Series.bfill()或Series.ffill()来回填或前向填充缺失值,从而实现复杂的数据依赖逻辑,避免低效的循环操作。

场景描述与挑战

在数据处理中,我们经常需要根据一列的特定条件来创建或修改另一列。更复杂的情况是,当条件不满足时,新列的值需要依赖于其上方或下方的某个有效值。例如,给定一个包含“colonne 1”和“dimension 1”的dataframe,我们的目标是创建一个新列“new”,其规则如下:

  • 如果“Dimension 1”列的值为“Organisation”,则“new”列的对应单元格取“Colonne 1”列的当前值。
  • 如果“Dimension 1”列的值不是“Organisation”,则“new”列的对应单元格需要从其下方最近的“Organisation”类型单元格中获取值,并向上填充。

传统的迭代方法(如使用for循环或apply函数)在处理大型DataFrame时效率低下。Pandas提供了更优化的矢量化操作来解决这类问题。

解决方案:结合where()与填充方法

Pandas中的Series.where()方法允许我们根据一个布尔条件选择性地替换Series中的值。当条件为False时,对应位置的值会被替换为NaN(默认),这为后续的填充操作创造了条件。接着,我们可以利用Series.bfill()(backward fill,向后填充)或Series.ffill()(forward fill,向前填充)来处理这些NaN值,实现复杂的依赖填充逻辑。

1. 使用 Series.where() 创建条件性缺失值

首先,我们使用where()方法来初步填充“new”列。如果“Dimension 1”是“Organisation”,则取“Colonne 1”的值;否则,该位置暂时留空(NaN)。

import pandas as pd
import io

# 示例数据
data = """
  Colonne 1   Dimension 1
0  MTN_LI2      Indicator
1  MTN_IRU      Indicator
2  MTN_ACE      Indicator
3  MTN_IME      Indicator
4     RIPP7  Organisation
5    CA_SOT     Indicator
6    CA_OTI     Indicator
7     CNW00  Organisation
8     BSNTF  Organisation
9     RIPNJ  Organisation
"""
df = pd.read_csv(io.StringIO(data), sep=r'\s{2,}', engine='python', skipinitialspace=True)

# 步骤1: 使用where()初步创建新列
# 如果 df['Dimension 1'] 等于 'Organisation',则取 df['Colonne 1'] 的值,
# 否则,该位置为 NaN
df['new_temp'] = df['Colonne 1'].where(df['Dimension 1'].eq('Organisation'))

print("--- 步骤1结果 (初步填充,非Organisation为NaN) ---")
print(df)

输出 df['new_temp'] 将会是:

--- 步骤1结果 (初步填充,非Organisation为NaN) ---
  Colonne 1   Dimension 1 new_temp
0  MTN_LI2      Indicator      NaN
1  MTN_IRU      Indicator      NaN
2  MTN_ACE      Indicator      NaN
3  MTN_IME      Indicator      NaN
4     RIPP7  Organisation    RIPP7
5    CA_SOT     Indicator      NaN
6    CA_OTI     Indicator      NaN
7     CNW00  Organisation    CNW00
8     BSNTF  Organisation    BSNTF
9     RIPNJ  Organisation    RIPNJ

2. 使用 Series.bfill() 向后填充(向下查找,向上填充)

为了满足“如果不是'Organisation',则取其下方最近的'Organisation'值”的需求,我们可以使用bfill()。bfill()会从Series的末尾开始,用遇到的第一个非NaN值填充其上方的所有NaN。

# 步骤2: 使用 bfill() 填充 NaN
df['new_bfill'] = df['new_temp'].bfill()

print("\n--- 步骤2结果 (使用 bfill() 填充) ---")
print(df[['Colonne 1', 'Dimension 1', 'new_bfill']])

输出结果:

Jukedeck
Jukedeck

一个由人工智能驱动的音乐创作工具,允许用户为各种项目生成免版税的音乐。

下载
--- 步骤2结果 (使用 bfill() 填充) ---
  Colonne 1   Dimension 1 new_bfill
0  MTN_LI2      Indicator     RIPP7
1  MTN_IRU      Indicator     RIPP7
2  MTN_ACE      Indicator     RIPP7
3  MTN_IME      Indicator     RIPP7
4     RIPP7  Organisation     RIPP7
5    CA_SOT     Indicator     CNW00
6    CA_OTI     Indicator     CNW00
7     CNW00  Organisation     CNW00
8     BSNTF  Organisation     BSNTF
9     RIPNJ  Organisation     RIPNJ

这完美地解决了最初的问题描述:“如果Dimension 1不等于Organisation,则该单元格获取其上方(按逻辑,是其下方最近的Organisation值向上填充)的单元格值。”

3. 使用 Series.ffill() 向前填充(向上查找,向下填充)

作为对比,如果需求是“如果不是'Organisation',则取其上方最近的'Organisation'值”,那么可以使用ffill()。ffill()会从Series的开头开始,用遇到的第一个非NaN值填充其下方的所有NaN。

# 步骤3: 使用 ffill() 填充 NaN (作为对比,解决不同需求)
df['new_ffill'] = df['new_temp'].ffill()

print("\n--- 步骤3结果 (使用 ffill() 填充) ---")
print(df[['Colonne 1', 'Dimension 1', 'new_ffill']])

输出结果:

--- 步骤3结果 (使用 ffill() 填充) ---
  Colonne 1   Dimension 1 new_ffill
0  MTN_LI2      Indicator       NaN
1  MTN_IRU      Indicator       NaN
2  MTN_ACE      Indicator       NaN
3  MTN_IME      Indicator       NaN
4     RIPP7  Organisation     RIPP7
5    CA_SOT     Indicator     RIPP7
6    CA_OTI     Indicator     RIPP7
7     CNW00  Organisation     CNW00
8     BSNTF  Organisation     BSNTF
9     RIPNJ  Organisation     RIPNJ

注意,ffill()在遇到第一个Organisation值(RIPP7)之前,无法填充前几个NaN,因为它们上方没有有效值。这说明了ffill()和bfill()在处理起始/结束NaN时的不同行为。

总结与注意事项

  • 高效性: 结合Series.where()和Series.bfill()/Series.ffill()是Pandas中处理这类条件性填充问题的最佳实践。它们是高度优化的矢量化操作,远比基于Python循环的方案快。
  • 灵活性: 这种模式非常灵活,可以应用于各种复杂的条件填充场景。where()可以配合任何布尔条件,而bfill()和ffill()则提供了两种基本的填充方向。
  • 初始NaN处理:
    • bfill()会填充其上方的NaN,如果Series的开头就是NaN且其下方没有非NaN值,则这些NaN会保留。
    • ffill()会填充其下方的NaN,如果Series的末尾是NaN且其上方没有非NaN值,则这些NaN会保留。
  • 链式操作: 在实际应用中,为了代码简洁,通常会将where()和bfill()/ffill()链式调用,例如:df['new'] = df['Colonne 1'].where(df['Dimension 1'].eq('Organisation')).bfill()。

通过掌握where()和填充方法,您可以高效且优雅地解决Pandas中涉及复杂条件和行间依赖的数据转换问题。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

71

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

1

2026.01.31

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

72

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

72

2026.01.31

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

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

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