DataFrame中按关联组将Flag=1行的a1值复制到同组其他行
解决DataFrame同组内复制Flag=1行的a1值问题
现有名为data的DataFrame,其中a1是10位ID列,前7位相同的行属于同一关联组。已通过以下代码计算出每组仅一行flag值为1,其余行flag为0:
data['flag'] = data.sort_values(relevant_columns, ascending = [True, True, False, False, False, False]).groupby(["a1_f7"])["Rank"].cumsum() data['flag'] = np.where(data['flag'] == 1, 1, 0)
尝试用以下代码将每组中flag=1行的a1值复制到同组其他flag=0的行时,目标行a1返回NaN:
row_with_flag_record = data.loc[data['flag'] == 1] data['a1'] = row_with_flag_record['a1'].astype(str)
错误原因
上述代码直接将row_with_flag_record['a1']赋值给整个data['a1'],但两者索引不匹配,只有索引重合的行会被赋值,其余行因无对应值返回NaN。
正确实现方法
方法一:使用groupby + transform
transform会将组内计算结果广播到该组的所有行,保持索引与原DataFrame一致:
# 按分组键a1_f7分组,提取每组中flag=1的a1值,广播到组内所有行 data['a1'] = data.groupby('a1_f7')['a1'].transform(lambda g: g[data.loc[g.index, 'flag'] == 1].iloc[0])
方法二:构建映射字典后替换
先建立分组键a1_f7对应flag=1行的a1值的映射关系,再通过map替换:
# 生成a1_f7到目标a1值的字典 a1_mapping = data[data['flag'] == 1].set_index('a1_f7')['a1'].to_dict() # 替换每个行的a1值 data['a1'] = data['a1_f7'].map(a1_mapping)
两种方法都能实现需求,将同组内flag=1行的a1值统一赋值给组内所有行,得到如下期望结果:
a0 a1 a2 ....... flag 88554 6667778892 12 ....... 1 88554 6667778892 2 ....... 0
内容的提问来源于stack exchange,提问作者van_nash24
相关产品推荐
相关产品推荐

