如何在Pandas时间序列中按区域-编码组统一更新最新名称
按Region-Code组合批量替换DataFrame的最新名称
原始数据
import pandas as pd df = pd.DataFrame({ 'date': [1,2,1,2,1,2,1,2], 'region': ['a','a','b','b','c','c','a','a'], 'code': [1,1,1,1,1,1,2,2], 'name': ['x','y','y','w','y','y','z','z'] })
输出的原始DataFrame:
date region code name 0 1 a 1 x 1 2 a 1 y 2 1 b 1 y 3 2 b 1 w 4 1 c 1 y 5 2 c 1 y 6 1 a 2 z 7 2 a 2 z
需求说明
针对每个region和code的组合,将该组合下所有行的name替换为该组合中**最新(date最大)**的name值,需注意部分code仅存在于特定区域。
期望结果
date region code name 0 1 a 1 y 1 2 a 1 y 2 1 b 1 w 3 2 b 1 w 4 1 c 1 y 5 2 c 1 y 6 1 a 2 z 7 2 a 2 z
解决方案
不用低效的for循环,直接用Pandas的分组和广播/合并操作即可实现:
方法1:分组后用transform广播最新值(适用于date已按顺序排列)
如果你的date列已经是按时间递增排列的,每个组的最后一行就是最新记录,直接用groupby+transform提取每组最后一个name值并广播到整组:
# 按region和code分组,提取每组最后一个name值替换原列 df['name'] = df.groupby(['region', 'code'])['name'].transform(lambda x: x.iloc[-1])
方法2:通过idxmax定位最新记录(适用于date无序的情况)
如果date列不是有序的,先找到每个组中date最大的行索引,再提取对应的name值,最后通过合并替换原列:
# 找到每个region-code组合中date最大的行索引 max_date_indices = df.groupby(['region', 'code'])['date'].idxmax() # 提取这些行的最新name,构建索引为region-code的Series latest_name_map = df.loc[max_date_indices].set_index(['region', 'code'])['name'] # 合并原DataFrame和最新name映射,替换原name列 df = df.merge(latest_name_map, on=['region', 'code'], suffixes=('', '_latest')) df['name'] = df['name_latest'] df.drop(columns=['name_latest'], inplace=True)
两种方法都能高效完成需求,避免了for循环的性能问题,尤其适合处理大数据量的情况。
内容的提问来源于stack exchange,提问作者Fernando Quintino
相关产品推荐
相关产品推荐

