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

按组检测行变化并将结果映射回原始DataFrame

解决方法:利用Pandas索引匹配或transform简化操作

方法一:使用transform一步完成(最简便)

直接用transform替代apply,结合排序操作,自动通过索引将结果映射回原DataFrame:

import pandas as pd
import datetime

my_df = pd.DataFrame({'col1': ['a', 'a', 'a', 'a', 'b', 'b', 'b'],
                      'col2': [2, 2, 3, 2, 5, 5, 5],
                      'col3': [datetime.date(2023, 2, 1),
                               datetime.date(2023, 3, 1),
                               datetime.date(2023, 5, 1),
                               datetime.date(2023, 4, 1),
                               datetime.date(2023, 3, 1),
                               datetime.date(2023, 2, 1),
                               datetime.date(2023, 4, 1)]})

# 排序、分组检测变化并自动映射回原表
my_df['col2_change'] = my_df.sort_values('col3').groupby('col1')['col2'].transform(
    lambda x: x != x.shift(1)
)
# 可选:将每组第一个元素的NaN替换为False
my_df['col2_change'] = my_df['col2_change'].fillna(False)

方法二:保留原索引进行赋值

如果想保留中间结果,可利用groupby.apply返回的多级索引直接赋值:

# 生成带多级索引的中间结果(分组键+原表索引)
my_df_temp = my_df.sort_values(by=['col3']).groupby('col1')['col2'].apply(
    lambda x: x != x.shift(1)
)
# 通过索引自动匹配赋值
my_df['col2_change'] = my_df_temp.fillna(False)

为什么直接赋值values会失败?

my_df_temp.col2_change.values是按排序后行顺序生成的数组,而原my_df的行顺序并未改变,直接按位置赋值会导致结果与原行不匹配。必须通过Pandas的索引匹配机制,才能保证结果对应到正确的行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 05:57:32