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

如何按Day分组过滤Pandas DataFrame:保留含指定字符串的行(非循环)

问题描述

现有如下Pandas DataFrame:

import pandas as pd

data = {
      'Day':[7,7,7,7,5,5,5,5],
     'Direction': ["North","NorthEast","NorthWest","West","East","EastWest","EastNorth","West"],
    'Bool':[True,False,False,False,True,False,False,False],}

df = pd.DataFrame(data)

原始数据:

DayDirectionBool
07NorthTrue
17NorthEastFalse
27NorthWestFalse
37WestFalse
45EastTrue
55EastWestFalse
65EastNorthFalse
75WestFalse

需求:按Day分组,过滤每个组内的行——仅保留Direction包含该组中Bool为True的行对应的Direction值的记录。例如Day=7组中,基准值是"North","West"不包含"North"会被剔除,"NorthWest"因包含"North"被保留。

期望输出:

DayDirectionBool
07NorthTrue
17NorthEastFalse
27NorthWestFalse
35EastTrue
45EastWestFalse
55EastNorthFalse

要求无需循环、不依赖行顺序(不能用shift())的高效实现方式。


高效实现方案

通过分组提取基准值+矢量化字符串匹配的方式实现,全程利用Pandas原生操作,无循环、不依赖行顺序:

# 1. 提取每个Day对应的基准方向(Bool=True的那条记录的Direction)
base_dir = df[df['Bool']].set_index('Day')['Direction']

# 2. 给原DataFrame添加对应Day的基准方向列
df['base'] = df['Day'].map(base_dir)

# 3. 过滤出Direction包含对应基准值的行,删除临时列
result = df[df['Direction'].str.contains(df['base'])].drop('base', axis=1)

# 重置索引(可选,仅为匹配期望输出的索引格式)
print(result.reset_index(drop=True))

步骤说明:

  • 第一步:一次性筛选出所有Bool=True的行,以Day为索引得到每个组的基准方向,无循环操作。
  • 第二步:用map方法将基准方向批量映射到原数据的每行,属于矢量化操作,效率远高于循环。
  • 第三步:通过str.contains矢量化判断每行Direction是否包含对应基准值,过滤后清理临时列即可得到目标结果。

运行结果与期望输出完全一致,且适合处理大规模数据集。

内容的提问来源于stack exchange,提问作者the phoenix

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 22:24:21