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

如何先满足条件再将值列表插入Pandas DataFrame单元格?

从Pandas DataFrame提取符合条件的团队列表并匹配插入

初始数据结构

初始DataFrame(Table_1)如下:

IDTeam AssignedDate Team StartDate Team EndService Date
23Red2022-09-012022-09-292022-08-15
23Blue2022-08-012022-09-152022-09-12
23Green2022-09-272022-09-302022-09-29
23Black2022-08-012022-08-172022-05-04
23Purple2022-08-152022-09-302022-08-17
07Blue2022-07-032022-09-302022-07-05
07Red2022-07-032022-07-052022-01-01
07Purple2022-05-012022-06-242022-05-15

需求说明

针对每个ID和对应的Service Date,筛选出同一ID下满足**Service Date处于Date Team Start和Date Team End之间**的所有团队,将这些团队去重后以逗号分隔的字符串形式插入对应行的新列Teams Involved中。

尝试的代码

以下代码能生成目标数据对象,但不知道如何将值插入原DataFrame对应单元格:

for id in df['ID']:
    a = df[(df['Service Date'] <= df['Date Team End']) &
           (df['Service Date'] >= df['Date Team Start'])]
    a = a.groupby(['case no', 'Service Date'])['Team Assigned'].apply(lambda 
    x: list(np.unique(x)))

期望结果

最终想要得到的DataFrame如下:

IDTeam AssignedDate Team StartDate Team EndService DateTeams Involved
23Red2022-09-012022-09-292022-08-15Blue, Black, Purple
23Blue2022-08-012022-09-152022-09-12Red, Blue, Purple
23Green2022-09-272022-09-302022-09-29Red, Green, Purple
23Black2022-08-012022-08-172022-08-01Blue, Black
23Purple2022-08-152022-09-302022-08-17Blue, Black, Purple
07Blue2022-07-032022-09-302022-07-05Blue, Red
07Red2022-07-032022-07-052022-08-01Blue
07Purple2022-05-012022-06-242022-05-15Purple

临时解决方案(待验证)

我修改了代码生成新的DataFrame,再与原DataFrame合并:

for id in df['ID']:
    a = df[(df['Service Date'] <= df['Date Team End']) &
           (df['Service Date'] >= df['Date Team Start'])]
    a = pd.DataFrame(a.groupby(['ID', 'Service Date'])['Team Assigned'].apply(lambda x: 
    list(np.unique(x)))).reset_index().rename(columns={'Team Assigned':'List of Teams'})

df2 = pd.merge(df, a, on=['ID', 'Service Date'], how='left')

但这个方法实现起来比较繁琐,希望有更简洁的方案。


优化解决方案

可以不用循环,直接通过分组处理实现,步骤如下:

  1. 先确保日期列是datetime类型(如果原数据不是的话):
df['Date Team Start'] = pd.to_datetime(df['Date Team Start'])
df['Date Team End'] = pd.to_datetime(df['Date Team End'])
df['Service Date'] = pd.to_datetime(df['Service Date'])
  1. 按ID分组,批量生成匹配的团队列表:
def get_involved_teams(group):
    # 对组内每个Service Date,筛选满足时间条件的团队
    def match_teams(service_date):
        mask = (group['Date Team Start'] <= service_date) & (group['Date Team End'] >= service_date)
        teams = group.loc[mask, 'Team Assigned'].unique()
        return ', '.join(sorted(teams))  # 可选排序,让结果更整齐
    
    group['Teams Involved'] = group['Service Date'].apply(match_teams)
    return group

# 分组处理后直接得到结果
result_df = df.groupby('ID').apply(get_involved_teams).reset_index(drop=True)

这个方法直接在原DataFrame上添加新列,无需额外合并,逻辑更清晰,也避免了循环带来的效率问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 18:10:29