如何用Pandas的groupby和max函数生成虚拟变量
解决方案
你的Python代码逻辑顺序错误,导致了AttributeError:你先计算了整个v2x_regime列的最大值,用np.where生成numpy数组后再尝试调用groupby,但numpy数组本身没有groupby方法,而且核心逻辑应该是先按年份分组计算每组的最大值,再和原数据逐行比较。
对应你R代码的Pandas实现,最贴合的写法是用groupby.transform,它能把分组计算的结果广播回原数据的每一行,和R中group_by后mutate的逻辑一致:
import pandas as pd import numpy as np # 直接在原DataFrame添加目标列 merged_data['biggest_democ'] = np.where( merged_data['v2x_regime'] == merged_data.groupby('year')['v2x_regime'].transform('max'), 1, 0 )
如果你习惯用assign方法(类似R中的mutate链式调用),也可以写成:
merged_data = merged_data.assign( biggest_democ = np.where( merged_data['v2x_regime'] == merged_data.groupby('year')['v2x_regime'].transform('max'), 1, 0 ) )
关键逻辑说明
merged_data.groupby('year')['v2x_regime'].transform('max'):对每个year分组,计算该组内v2x_regime的最大值,返回一个和原数据行数相同的Series,每行对应所在年份的最大值。np.where(条件, 1, 0):逐行判断原v2x_regime值是否等于对应年份的最大值,满足则设为1,否则设为0。
内容的提问来源于stack exchange,提问作者Brian Lookabaugh
相关产品推荐
相关产品推荐

