如何在Pandas分组后直接更新原DataFrame中的数值?
问题描述
现有如下DataFrame:
import pandas as pd df = pd.DataFrame({'dim_unit' :['m', 'cm', 'cm', 'm', 'ft', 'in'], 'Length' : [1,2,3,4,5,6], 'Width' : [5,6,7,8,9,10] })
需求是按dim_unit分组,对Length和Width列应用对应缩放因子,将所有数据转换为统一维度(实际场景包含更多单位和待转换列)。
尝试过以下方法但存在问题:
- 用
groupby获取分组后计算转换值,但无法更新原DataFrame:
g= df.groupby('dim_unit') g.get_group('cm')["Width"].apply(lambda x: x*100)
- 尝试用
transform替代apply无效果;新增列的方式会生成大量含NaN的列,后续合并繁琐:
df['len_cm_to_m']= df.get_group('cm')["Width"].apply(lambda x: x*100)
希望找到直接更新原DataFrame数值的方法,或通过匹配索引更新的方案。
解决方案
方法1:单位转换映射字典 + 广播计算(推荐)
先定义单位到目标单位(以米为例)的转换因子字典,直接按行匹配因子对多列批量计算,无需分组,效率更高且无NaN:
# 定义转换因子:key为原单位,value为转换为米的系数 conversion_factors = { 'm': 1, 'cm': 0.01, 'ft': 0.3048, 'in': 0.0254 } # 获取每行对应的转换因子 df['conversion_factor'] = df['dim_unit'].map(conversion_factors) # 批量转换Length和Width列(直接覆盖原列,也可新增列) cols_to_convert = ['Length', 'Width'] df[cols_to_convert] = df[cols_to_convert].mul(df['conversion_factor'], axis=0) # 可选:删除临时转换因子列 df.drop('conversion_factor', axis=1, inplace=True)
方法2:groupby结合transform更新原列
若需保留分组逻辑,可通过transform返回与原索引对齐的结果,直接赋值更新原列:
def convert_group(group): unit = group['dim_unit'].iloc[0] factors = { 'm': 1, 'cm': 0.01, 'ft': 0.3048, 'in': 0.0254 } factor = factors[unit] group[['Length', 'Width']] = group[['Length', 'Width']] * factor return group[['Length', 'Width']] # 用transform获取对齐后的转换结果,直接覆盖原列 df[['Length', 'Width']] = df.groupby('dim_unit')[['Length', 'Width']].transform(convert_group)
方法3:索引匹配精准更新
针对复杂转换逻辑,可先遍历分组计算转换值,再通过索引定位更新原DataFrame:
# 复制原DataFrame存储转换后数据 converted_df = df.copy() # 遍历每个分组,按索引更新对应行 for unit, group in df.groupby('dim_unit'): factor = { 'm': 1, 'cm': 0.01, 'ft': 0.3048, 'in': 0.0254 }[unit] converted_df.loc[group.index, ['Length', 'Width']] = group[['Length', 'Width']] * factor # 替换原df(或直接使用converted_df) df = converted_df
内容的提问来源于stack exchange,提问作者Elise
相关产品推荐
相关产品推荐

