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

使用Pandas groupby实现分组内填充Bool=1对应High值的方法

高效实现DataFrame分组填充指定值的方法

针对需求:按Date和Ticker分组,将组内Bool=1对应的High值填充到组内所有行的New_Row列,以下是两种无需手动循环的高效矢量化实现方案:

方案一:groupby + transform

利用pandas的分组转换能力,直接将目标值广播到组内所有行:

import pandas as pd

# 示例数据
data = {
    'Date': ['2023-01-01', '2023-01-01', '2023-01-02', '2023-01-02'],
    'Ticker': ['AAPL', 'AAPL', 'MSFT', 'MSFT'],
    'High': [150, 152, 300, 305],
    'Low': [148, 150, 298, 302],
    'Bool': [0, 1, 1, 0]
}
df = pd.DataFrame(data)

# 核心代码:简洁的transform写法
df['New_Row'] = df.groupby(['Date', 'Ticker'])['High'].transform(
    lambda x: x[df.loc[x.index, 'Bool'] == 1].iloc[0]
)

逻辑说明

  • groupby(['Date', 'Ticker']) 按指定维度分组,确保每个组对应唯一的日期+股票代码组合
  • transform 会自动将分组计算的结果对齐到原DataFrame的每一行,无需手动处理索引
  • 匿名函数中通过组内索引筛选出Bool=1的行,提取对应的High值(题目保证每组仅一行符合条件,iloc[0]即可取到唯一值)

方案二:筛选后合并

先提取Bool=1的行作为映射表,再通过左连接填充所有行:

# 提取Bool=1的行作为映射表
bool_high_map = df[df['Bool'] == 1][['Date', 'Ticker', 'High']].rename(columns={'High': 'New_Row'})

# 左连接原DataFrame,自动填充组内所有行
df = df.merge(bool_high_map, on=['Date', 'Ticker'], how='left')

逻辑说明

  • 先筛选出所有符合Bool=1的行,保留关键列并重命名为目标列名
  • merge按Date和Ticker左连接,确保每个分组的所有行都能匹配到对应的High值

效率说明

两种方案均为pandas矢量化操作,避免了手动循环的性能损耗,适合处理大规模数据集:

  • transform方案无需额外创建中间表,代码更紧凑
  • 合并方案逻辑更直观,对分组操作不熟悉的场景更容易理解

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 15:39:23