如何在Pandas DataFrame中按组填充新列(A、B列相等触发)
解决Pandas DataFrame生成分组统一新列的问题
嘿,我刚好能搞定这个需求!你要的是按A列分组,把每个组里满足A == B的那一行的C值,填充到该组所有行的new列里对吧?下面给你两种实用的实现方式:
方法一:先做映射再填充(直观易懂)
这个思路很直接:先找出每个A分组对应的目标C值,再把这些值映射回原DataFrame:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'A': [100, 100, 100, 200, 200, 200], 'B': [100, 10021, 10022, 200, 20021, 20022], 'C': ['colors', 'Blue', 'Red', 'Shape', 'Square', 'Circle'] }) # 第一步:生成A到对应C值的映射字典(只保留A==B的行) group_map = df[df['A'] == df['B']].set_index('A')['C'].to_dict() # 第二步:用映射给每行分配new值 df['new'] = df['A'].map(group_map) # 要是你需要把new列统一转成小写(比如示例里200组的new是shape),加个str.lower()就行: # df['new'] = df['A'].map(group_map).str.lower()
运行后得到的结果完全符合你的期望:
A B C new 0 100 100 colors colors 1 100 10021 Blue colors 2 100 10022 Red colors 3 200 200 Shape Shape 4 200 20021 Square Shape 5 200 20022 Circle Shape
方法二:用groupby+transform(更Pandas风格)
如果你喜欢用Pandas的分组原生操作,这种写法更简洁,不需要单独创建映射字典:
def get_group_target(group): # 取出分组里A==B的那一行的C值,默认每个组只有一个这样的行,所以用iloc[0] return group.loc[group['A'] == group['B'], 'C'].iloc[0] # 按A分组后,用transform把每个组的目标值填充到所有行 df['new'] = df.groupby('A').transform(get_group_target)
小提醒
- 要保证每个
A分组恰好有一行满足A == B,如果有多个匹配行,你可以改成取第一个(iloc[0])、最后一个(iloc[-1])或者合并值;如果没有匹配行,记得用fillna()给这些组加个默认值,比如df['new'] = df['A'].map(group_map).fillna('unknown')。 - 示例里200组的
new是小写的shape,如果需要统一大小写,在提取值的时候加上.str.lower()就好,比如方法一中的group_map = df[df['A'] == df['B']].set_index('A')['C'].str.lower().to_dict()。
内容的提问来源于stack exchange,提问作者Diogo Serra
相关产品推荐
相关产品推荐

