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

碧海醫心
发布: 2025-10-08 11:05:31
原创
760人浏览过

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'列的值是递增的:

图改改
图改改

在线修改图片文字

图改改 455
查看详情 图改改
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中的数据,并实现复杂的修改需求。在实际应用中,可以根据具体情况调整条件和操作,以满足不同的数据处理需求。

以上就是Pandas:基于切片和shift()函数修改DataFrame中的值的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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