按组检测行变化并将结果映射回原始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
相关产品推荐
相关产品推荐

