基于容器事件出现次数生成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)
逻辑说明
- 用
replace完成Dry事件的批量赋值,避免逐行遍历,效率更高; - 通过
groupby+cumcount标记每个容器下Clean事件的出现顺序,序号0代表首次出现; - 利用
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
相关产品推荐
相关产品推荐

