使用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
相关产品推荐
相关产品推荐

