Pandas按Con_Num分组取Is_Prim=Yes行值批量更新同组Con_Type列
解决方法
方法1:使用map映射(更简洁高效)
先构造每个Con_Num对应的主类型映射表,再直接赋值:
import pandas as pd # 原始DataFrame df = pd.DataFrame({'Con_Num': [1, 1, 1, 1, 2, 2, 2, 2, 3, 3], 'Con_Type': ['A', 'A', 'B', 'C', 'A', 'B', 'B', 'C', 'C', 'C'], 'Is_Prim':['No','Yes','No','No','No','No','No','Yes','No','Yes']}) # 构造Con_Num到Is_Prim=Yes对应Con_Type的映射关系 prim_type_map = df[df['Is_Prim'] == 'Yes'].set_index('Con_Num')['Con_Type'] # 批量替换Con_Type列 df['Con_Type'] = df['Con_Num'].map(prim_type_map)
运行后得到的df完全符合预期输出,除Con_Type外的所有列都会完整保留,不会被改动。
方法2:使用groupby + transform(适合更复杂的分组逻辑)
如果需要沿用transform写法,可以按如下逻辑调整,获取分组内对应Is_Prim=Yes的取值:
df['Con_Type'] = df.groupby('Con_Num')['Con_Type'].transform( lambda ser: ser[df.loc[ser.index, 'Is_Prim'] == 'Yes'].iloc[0] )
说明
两种方法都默认每个Con_Num分组下有且仅有一行Is_Prim = 'Yes'的记录,符合示例场景。如果存在多个Yes的情况,可以自行调整取值逻辑(比如取第一个、去重等)。
内容的提问来源于stack exchange,提问作者user627099
相关产品推荐
相关产品推荐

