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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 12:25:25