You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何批量将DataFrame中不在指定区间的行对应值设为NaN?

问题描述

现有两个Pandas DataFrame:

  • df_vals:包含my_index(浮点型序列)和my_vals列
  • df_intervals:包含start和end列,每行代表一个闭区间

需求:若df_vals中某行的my_index不在df_intervals的任意区间内,将该行的my_vals设为NaN。要求自动批量处理,禁止手动逐个指定区间条件(实际数据区间数量远多于示例)。

解决方案

以下提供两种高效批量处理的实现方式:

方法1:矢量化广播判断(适合区间数量适中的场景)

利用Numpy广播特性,一次性生成所有my_index与区间的匹配矩阵,再判断是否存在有效区间:

步骤1:构造示例数据(可替换为实际数据)

import pandas as pd
import numpy as np

# 示例df_vals
df_vals = pd.DataFrame({
    'my_index': [1.2, 3.5, 5.7, 7.1, 9.3, 10.5],
    'my_vals': [10, 20, 30, 40, 50, 60]
})

# 示例df_intervals
df_intervals = pd.DataFrame({
    'start': [0, 4, 8],
    'end': [2, 6, 10]
})

步骤2:批量判断并设置NaN

# 生成布尔矩阵:每行对应df_vals的my_index,每列对应一个区间的匹配结果
in_interval = (df_vals['my_index'].values[:, None] >= df_intervals['start'].values) & \
              (df_vals['my_index'].values[:, None] <= df_intervals['end'].values)

# 判断每个my_index是否至少属于一个区间
valid_indices = in_interval.any(axis=1)

# 将不在任何区间的my_vals设为NaN
df_vals.loc[~valid_indices, 'my_vals'] = np.nan

方法2:合并区间后判断(适合区间数量极大的场景)

当区间数量过多时,先合并重叠/相邻区间减少计算量,再用IntervalIndex做匹配:

步骤1:合并重叠区间

# 先按start排序区间
sorted_intervals = df_intervals.sort_values('start').reset_index(drop=True)

merged = []
current_start = sorted_intervals['start'].iloc[0]
current_end = sorted_intervals['end'].iloc[0]

# 遍历合并重叠/相邻区间(浮点型需考虑精度误差)
for _, row in sorted_intervals.iloc[1:].iterrows():
    if row['start'] <= current_end + 1e-9:
        current_end = max(current_end, row['end'])
    else:
        merged.append((current_start, current_end))
        current_start = row['start']
        current_end = row['end']
merged.append((current_start, current_end))

# 转换为合并后的区间DataFrame
merged_intervals = pd.DataFrame(merged, columns=['start', 'end'])

步骤2:判断并设置NaN

# 创建闭区间索引
interval_index = pd.IntervalIndex.from_arrays(merged_intervals['start'], merged_intervals['end'], closed='both')

# 判断my_index是否在任意合并后的区间内
valid_indices = df_vals['my_index'].isin(interval_index)

# 设置NaN
df_vals.loc[~valid_indices, 'my_vals'] = np.nan

内容的提问来源于stack exchange,提问作者Bas R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 18:55:27