0

0

Pandas:基于切片和shift()函数修改DataFrame中的值

碧海醫心

碧海醫心

发布时间:2025-10-08 11:05:31

|

789人浏览过

|

来源于php中文网

原创

pandas:基于切片和shift()函数修改dataframe中的值

本文档旨在指导读者如何使用Pandas DataFrame的切片和shift()函数,根据特定条件修改DataFrame中的值。我们将通过一个实际案例,演示如何筛选DataFrame,查找满足条件的行,并将这些行以及它们之前的若干行,在指定列中标记为True。

问题描述

假设我们有一个DataFrame df,需要根据以下步骤修改其中的数据:

  1. 首先,根据某一列(例如'C')的值进行筛选,得到一个新的DataFrame。
  2. 然后,在新DataFrame中找到满足特定条件的行(例如,'A'列的值是递增的)。
  3. 最后,在原始DataFrame df 中,将这些满足条件的行以及它们之前的两行,在另一列(例如'B')中标记为 True。

解决方案

以下是一种实现上述需求的方案,它结合了DataFrame的切片、shift()函数以及NumPy的flatnonzero函数。

1. 创建DataFrame

首先,我们创建一个示例DataFrame:

import pandas as pd
import numpy as np
import itertools

df = pd.DataFrame({'A': [np.nan, np.nan, 1944.09, np.nan, np.nan, 1926.0, np.nan, 1930.31, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 1917.66, 1920.43, np.nan, 1909.04, np.nan, np.nan, np.nan, np.nan, np.nan, 1920.05, np.nan, 1915.4, 1921.87, np.nan, np.nan, np.nan, 1912.42, 1920.08, 1915.8, np.nan, np.nan, np.nan, np.nan, 1919.71, 1916.2, np.nan, 1926.79, np.nan, 1918.66, np.nan, 1925.5, 1922.22, np.nan, np.nan, 1927.87, 1923.24, np.nan, 1929.53, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 1918.37, np.nan, np.nan, 1923.61, np.nan, 1917.1, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 1924.48, np.nan, np.nan, 1923.03, np.nan, np.nan, np.nan, np.nan, 1926.87, np.nan, np.nan, np.nan, 1921.79, np.nan, 1925.27, np.nan, 1919.0, np.nan, np.nan, 1923.74, np.nan, np.nan, np.nan, np.nan, 1911.61, np.nan, 1923.33, np.nan, np.nan, np.nan, 1912.0, np.nan, 1915.8, np.nan, 1913.05, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 1916.93, np.nan, 1913.69, np.nan, np.nan, np.nan, np.nan, 1918.38, 1913.7, np.nan, np.nan, np.nan, np.nan, np.nan, 1919.5, np.nan, 1916.14, np.nan, np.nan, np.nan, np.nan, np.nan, 1921.28, np.nan, np.nan, np.nan, np.nan, np.nan, 1915.0, np.nan, np.nan, np.nan, np.nan, np.nan, 1927.48, 1889.17, np.nan, 1921.91, 1917.67, 1923.23, np.nan, np.nan, np.nan, 1909.88, np.nan, 1913.82, 1902.51, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, np.nan, 1920.15], 'C': [False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, True, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False]})

2. 筛选DataFrame

根据'C'列的值筛选DataFrame,创建一个新的DataFrame a:

a = df[df.C]['A']

3. 查找满足条件的行

使用shift()函数和比较运算符,创建一个布尔掩码,用于标识满足条件的行。在这个例子中,条件是'A'列的值是递增的:

超级简历WonderCV
超级简历WonderCV

免费求职简历模版下载制作,应届生职场人必备简历制作神器

下载
mask = (a > a.shift(1)) & (a.shift(1) > a.shift(2))

4. 获取满足条件的行的索引

使用np.flatnonzero函数获取掩码中True值的索引。这些索引对应于满足条件的行在DataFrame a 中的位置。然后,使用itertools.chain.from_iterable生成需要设置为True的行的索引范围。

idxs = itertools.chain.from_iterable(range(a.index[i-2], a.index[i]+1) for i in np.flatnonzero(mask))

5. 修改原始DataFrame

最后,使用isin()函数和切片操作,在原始DataFrame df 的'B'列中,将满足条件的行以及它们之前的两行标记为 True。

df['B'] = df.index.isin(set(idxs))

或者,为了提高效率,可以先将'B'列全部设置为False,然后使用.loc选择需要设置为True的行:

df['B'] = False
df.loc[idxs, 'B'] = True

6. 查看结果

print(df)

输出结果将显示DataFrame df,其中'B'列的值已根据条件进行了修改。

注意事项

  • shift()函数会将序列中的元素向后移动指定的位数。在比较时,需要注意处理缺失值(NaN)。
  • np.flatnonzero()函数返回的是数组中非零元素的索引。
  • 使用.loc进行赋值操作时,可以确保只修改指定的行,而不会影响DataFrame的其他部分。
  • 当DataFrame较大时,直接使用isin()可能会比较慢。先将'B'列设置为False,然后使用.loc进行赋值,通常可以提高效率。

总结

本文档介绍了如何使用Pandas DataFrame的切片、shift()函数以及NumPy的flatnonzero函数,根据特定条件修改DataFrame中的值。通过结合这些技术,可以灵活地处理DataFrame中的数据,并实现复杂的修改需求。在实际应用中,可以根据具体情况调整条件和操作,以满足不同的数据处理需求。

相关专题

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

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

49

2025.12.04

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

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

1435

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

224

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

85

2025.10.17

go语言 数组和切片
go语言 数组和切片

本专题整合了go语言数组和切片的区别与含义,阅读专题下面的文章了解更多详细内容。

45

2025.09.03

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

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

7

2025.12.31

php网站源码教程大全
php网站源码教程大全

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

4

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

7

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

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号