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

基于分组操作给DataFrame添加条件匹配的新列

基于分组操作给DataFrame添加条件匹配的新列

嗨,我来帮你搞定这个需求!你想要按ID分组后,给每行添加col2和col3,分别对应组内col1为BX和AX的value值对吧?用Pandas的分组(groupby)结合transform方法就能轻松实现,下面是具体步骤:

首先先把你的原始数据构建成DataFrame:

import pandas as pd

df = pd.DataFrame({
    'ID': ['A', 'A', 'B', 'B', 'C', 'C'],
    'value': [1, 2, 3, 4, 5, 6],
    'col1': ['BX', 'AX', 'AX', 'BX', 'BX', 'AX']
})

接下来有两种写法,一种是自定义函数更清晰,另一种是用lambda更简洁:

方法一:自定义分组处理函数

我们可以为提取BX、AX对应的value分别写函数,再用transform把结果广播到组内每一行:

def get_bx_val(group):
    # 从分组中筛选col1为BX的行,取第一个value
    return group[group['col1'] == 'BX']['value'].iloc[0]

def get_ax_val(group):
    # 从分组中筛选col1为AX的行,取第一个value
    return group[group['col1'] == 'AX']['value'].iloc[0]

# 添加新列
df['col2'] = df.groupby('ID').transform(get_bx_val)
df['col3'] = df.groupby('ID').transform(get_ax_val)

方法二:用lambda表达式简化代码

如果觉得写函数麻烦,也可以直接用lambda表达式一行搞定:

df['col2'] = df.groupby('ID')['value'].transform(
    lambda x: x[df.loc[x.index, 'col1'] == 'BX'].iloc[0]
)
df['col3'] = df.groupby('ID')['value'].transform(
    lambda x: x[df.loc[x.index, 'col1'] == 'AX'].iloc[0]
)

两种方法运行后,都会得到你想要的结果:

IDvaluecol1col2col3
A1BX12
A2AX12
B3AX43
B4BX43
C5BX56
C6AX56

这里要说明下:transform的作用是把分组后的计算结果映射回原DataFrame的每一行,确保每个ID组内的所有行都能拿到对应组的BX、AX值。如果你的实际数据中,某个ID组可能有多个BX/AX的行,iloc[0]会取第一个匹配的值,你可以根据需求改成mean()(取平均值)或者其他聚合方式哦~

备注:内容来源于stack exchange,提问作者Olive

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 15:27:51