You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 10:58:11