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

基于容器事件出现次数生成Temperature列的Pandas实现

实现DataFrame的Temperature列新增需求

问题背景

给定如下结构的DataFrame:

Container Event
A         Clean
B         Dry
A         Clean
A         Dry
B         Clean
C         Clean
C         Clean
C         Clean

需要新增名为Temperature的列,遵循以下规则:

  • 每个容器首次出现Clean事件时,Temperature值为4
  • 该容器后续出现的Clean事件,Temperature值为3
  • Dry事件对应的Temperature值始终为1

处理后的目标DataFrame如下:

Container  Event  Temperature
A          Clean  4
B          Dry    1
A          Clean  3
A          Dry    1
B          Clean  4
C          Clean  4
C          Clean  3
C          Clean  3

可复现原始DataFrame的代码:

import pandas as pd

d = {'Container': ['A','B','A','A','B','C','C','C'], 'Event': ['Clean', 'Dry', 'Clean', 'Dry', 'Clean', 'Clean', 'Clean', 'Clean']}
df = pd.DataFrame(data=d)

解决方案

高效批量实现代码

# 1. 先为所有Dry事件批量赋值1
df['Temperature'] = df['Event'].replace({'Dry': 1})

# 2. 筛选Clean事件行,按容器分组统计出现顺序(序号从0开始)
clean_sequence = df[df['Event'] == 'Clean'].groupby('Container').cumcount()

# 3. 首次Clean(序号0)赋值4,后续Clean(序号≥1)赋值3
df.loc[clean_sequence.index, 'Temperature'] = clean_sequence.map({0: 4}).fillna(3)

逻辑说明

  1. 用replace完成Dry事件的批量赋值,避免逐行遍历,效率更高;
  2. 通过groupby+cumcount标记每个容器下Clean事件的出现顺序,序号0代表首次出现;
  3. 利用map和fillna快速完成首次/后续Clean事件的赋值,最后回填到原DataFrame对应位置。

备选逐行实现(适合小数据集)

如果数据集规模较小,也可以用apply逐行处理,逻辑更直观:

df['Temperature'] = df.apply(
    lambda row: 1 if row['Event'] == 'Dry' 
    else 4 if len(df[(df['Container'] == row['Container']) & (df['Event'] == 'Clean')].loc[:row.name]) == 1 
    else 3,
    axis=1
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 00:06:02