
本教程探讨如何在Pandas DataFrame中高效地为每一行查找满足特定条件(如`lower >= upper`)的最近历史行索引(日期)。针对传统`df.apply`方法的低效性,文章重点介绍并演示了如何利用Python内置的`bisect`模块实现高性能查找,并简要提及其他优化尝试,最终旨在提供一种处理此类依赖历史状态问题的最佳实践。
在数据分析和处理中,我们经常会遇到需要基于当前行之前的历史数据来计算新列的场景。一个典型的例子是,对于DataFrame中的每一行,我们需要找到一个特定条件(例如,某一列的值大于或等于另一列的值)在之前行中最后一次满足时的索引(通常是日期时间索引)。然而,直接使用Pandas的apply方法进行逐行操作,尤其是在大数据集上,效率会非常低下。
考虑以下场景:我们有一个包含lower和upper两列的DataFrame,并以日期作为索引。目标是创建一个新列prev,其中包含满足 lower >= upper 条件的最近历史行的日期索引。
import pandas as pd
import numpy as np
# 示例DataFrame
data = {'lower': [7, 1, 6, 1, 1, 1, 1, 11, 1, 1],
'upper': [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]}
df = pd.DataFrame(data=data)
df['DATE'] = pd.date_range('2020-01-01', periods=len(data['lower']))
df['DATE'] = pd.to_datetime(df['DATE'])
df.set_index('DATE', inplace=True)
# 使用 df.apply 的原始方法
def get_most_recent_index(row):
# 查找当前行之前的所有行
previous_indices = df.loc[:row.name - pd.Timedelta(minutes=1)]
# 筛选满足条件的行,并获取最大的索引(即最近的日期)
recent_index = previous_indices[previous_indices['lower'] >= row['upper']].index.max()
return recent_index
df['prev'] = df.apply(get_most_recent_index, axis=1)
print(df)上述代码中的get_most_recent_index函数通过df.loc对DataFrame进行切片,然后进行条件筛选,最后获取最大索引。这种方法的问题在于:
为了显著提升性能,我们可以利用Python内置的bisect模块。bisect模块提供了二分查找算法,可以在已排序的序列中快速定位元素。虽然这个问题并非完全向量化,但通过巧妙地结合bisect和字典来维护历史状态,可以实现准线性时间复杂度的解决方案。
核心思想是:
以下是使用bisect模块的优化实现:
from bisect import bisect_left
def get_prev_bs(lower_series, upper_series, date_index):
# 获取所有不重复的 lower 值并排序
uniq_lower = sorted(set(lower_series))
# 存储每个 lower 值最后一次出现的日期
last_seen = {}
# 迭代 DataFrame 的每一行
for l, u, d in zip(lower_series, upper_series, date_index):
# 使用 bisect_left 找到第一个大于或等于当前 upper 值的 lower 值的索引
# 这意味着 uniq_lower[idx:] 包含了所有 >= u 的 lower 值
idx = bisect_left(uniq_lower, u)
max_date = None
# 遍历所有满足条件的 lower 值
for lv in uniq_lower[idx:]:
if lv in last_seen:
# 如果该 lower 值在历史中出现过
if max_date is None:
max_date =以上就是Pandas DataFrame高效查找:定位满足条件的最近历史索引日期的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号