如何按Car#分组为DataFrame新增Baseline列并填充对应基准值
问题描述
我有一个包含Car#、measurement_type、measurement_value列的DataFrame,数据如下:
Car# measurement_type measurement_value 1 back to back1 10.3 1 back to back2 10.2 1 baseline 10.4 2 back to back1 11.5 2 back to back2 10.8 2 baseline 10.9
希望新增一列Baseline,填充每辆车对应的baseline值,期望输出:
Car# measurement_type measurement_value Baseline 1 back to back1 10.3 10.4 1 back to back2 10.2 10.4 1 baseline 10.4 10.4 2 back to back1 11.5 10.9 2 back to back2 10.8 10.9 2 baseline 10.9 10.9
我尝试了以下代码但无法正常运行:
grouped = df.groupby('car#') for i in grouped: if df['measurement_type'] == 'baseline': df['Baseline'] = df.loc[df['measurement_type'] == 'baseline','measurement_value']
解决方案
问题分析
你的代码存在两个核心问题:
- 分组循环逻辑错误:
groupby返回的是(组标识, 子DataFrame)的元组,你的循环没有对每个分组单独处理,而是直接操作整个原DataFrame。 - 赋值逻辑错误:直接给
df['Baseline']赋值时,没有按Car#匹配对应baseline值,会导致值无法正确对应到每辆车。
方法1:使用map(高效简洁)
先提取每个Car#对应的baseline值生成字典,再通过map快速匹配填充:
# 提取每个Car#的baseline值,转为字典 baseline_map = df[df['measurement_type'] == 'baseline'].set_index('Car#')['measurement_value'].to_dict() # 给新列赋值 df['Baseline'] = df['Car#'].map(baseline_map)
方法2:使用groupby.transform
利用transform对每个分组广播baseline值,适合需要在分组内做更多操作的场景:
df['Baseline'] = df.groupby('Car#').apply( lambda group: group['measurement_value'][group['measurement_type'] == 'baseline'].iloc[0] ).reset_index(level=0, drop=True)
方法3:使用merge
通过合并操作将baseline数据关联到原DataFrame,逻辑直观:
# 提取baseline数据并重命名列 baseline_df = df[df['measurement_type'] == 'baseline'][['Car#', 'measurement_value']].rename(columns={'measurement_value': 'Baseline'}) # 左连接合并 df = df.merge(baseline_df, on='Car#', how='left')
以上三种方法都能实现需求,其中map方法性能最优,适合处理大数据量。
内容的提问来源于stack exchange,提问作者Soodi
相关产品推荐
相关产品推荐

