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

基于Pandas根据AM_PM字段匹配填充bag_weight列的实现问题

问题解决:向量化实现DataFrame匹配填充bag_weight列

运行环境

Python 3.10.13 (main, Aug 25 2023, 13:20:03) [GCC 9.4.0]
pandas 版本 2.1.1
numpy 版本 1.26.2
pyarrow 版本 14.0.1

需求说明

为DataFrame df_entry_log 创建bag_weight列,填充规则如下:

  • 当df_entry_log['AM_PM']为"AM"时,用df_entry_log['prev_wrk_day']匹配df_details的gate_date字段,取对应bag_weight值填充
  • 当df_entry_log['AM_PM']为"PM"时,用df_entry_log['entry_date']匹配df_details的gate_date字段,取对应bag_weight值填充
    要求采用向量化方法实现,避免循环操作。

数据示例

df_entry_log 示例数据

guest     entry_date     AM_PM  prev_wrk_day   next_wrk_day
1     janet     2007-01-17     PM     2007-01-16     2007-01-18
2     janet     2007-04-25     AM     2007-04-24     2007-04-26
3     janet     2007-07-25     AM     2007-07-24     2007-07-26

df_details 示例数据

guest    gate_date  bag_weight
8     janet     2007-01-16     97.10    
9     janet     2007-01-17     94.95   
10    janet     2007-01-18     89.07  

向量化实现方案

以下两种方法均为向量化操作,效率远高于循环,适合大数据量场景:

方法1:字典映射 + np.where

先将df_details转换为键值对映射,再通过np.where批量选择匹配键,最后映射取值:

import numpy as np
import pandas as pd

# 将df_details转为(guest, gate_date)为键、bag_weight为值的字典
weight_map = df_details.set_index(['guest', 'gate_date'])['bag_weight'].to_dict()

# 批量生成匹配键:根据AM_PM选择对应日期列
match_keys = np.where(
    df_entry_log['AM_PM'] == 'AM',
    list(zip(df_entry_log['guest'], df_entry_log['prev_wrk_day'])),
    list(zip(df_entry_log['guest'], df_entry_log['entry_date']))
)

# 映射填充bag_weight列,无匹配值则填充NaN
df_entry_log['bag_weight'] = np.array([weight_map.get(key, np.nan) for key in match_keys])

方法2:分条件合并填充

通过布尔掩码筛选AM/PM行,分别与df_details合并后填充对应值:

import pandas as pd

# 初始化bag_weight列为NaN
df_entry_log['bag_weight'] = pd.NA

# 处理AM场景:匹配guest+prev_wrk_day与guest+gate_date
am_mask = df_entry_log['AM_PM'] == 'AM'
df_entry_log.loc[am_mask, 'bag_weight'] = df_entry_log.loc[am_mask].merge(
    df_details,
    left_on=['guest', 'prev_wrk_day'],
    right_on=['guest', 'gate_date'],
    how='left'
)['bag_weight'].values

# 处理PM场景:匹配guest+entry_date与guest+gate_date
pm_mask = df_entry_log['AM_PM'] == 'PM'
df_entry_log.loc[pm_mask, 'bag_weight'] = df_entry_log.loc[pm_mask].merge(
    df_details,
    left_on=['guest', 'entry_date'],
    right_on=['guest', 'gate_date'],
    how='left'
)['bag_weight'].values

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 18:05:29