如何为字符串列表元素添加x前缀,用于lambda表达式动态字段调用?
解决方案
一、动态生成分组键(保留原逻辑的适配方案)
你可以通过从分组列列表中动态提取字段值并组成元组,替代硬编码的字段引用,实现分组字段的灵活变更。同时建议不要用list作为变量名,避免覆盖Python内置的list类型:
group_cols = ['year','month'] # 计算分组均值,直接生成字典(无需额外转列表) mean_dict = data.groupby(group_cols)["quantity"].mean().to_dict() df["m"] = df.apply( lambda x: mean_dict.get(tuple(x[col] for col in group_cols), 0), axis=1 )
这里用dict.get()方法替代了原有的if...else,代码更简洁,同时tuple(x[col] for col in group_cols)会根据group_cols的内容自动生成对应元组,只要修改group_cols里的字段,就能自动适配。
二、更高效的重构方案(推荐)
原代码用apply逐行处理效率极低,尤其是数据量大时。推荐用以下两种更高效的方式实现需求:
方法1:直接合并均值表
先计算分组均值,再通过merge关联到目标DataFrame,最后填充缺失值为0:
group_cols = ['year','month'] # 计算分组均值并命名列 mean_df = data.groupby(group_cols)["quantity"].mean().reset_index(name='m') # 关联到df,左连接保留所有行 df = df.merge(mean_df, on=group_cols, how='left') # 缺失值填充为0 df['m'] = df['m'].fillna(0)
方法2:用map批量映射
将df的分组列转为元组后,直接用map匹配字典中的均值:
group_cols = ['year','month'] mean_dict = data.groupby(group_cols)["quantity"].mean().to_dict() # 把分组列转为元组,再批量映射 df['m'] = df[group_cols].apply(tuple, axis=1).map(mean_dict).fillna(0)
原代码的冗余点说明
你原代码中m.groupby(list)["quantity"].apply(list).to_dict()属于冗余操作——data.groupby(list).agg({"quantity":"mean"})已经直接得到了分组均值,无需再转成列表存入字典,直接用groupby(...).mean().to_dict()就能生成键为分组元组、值为均值的字典,取值时也不需要额外加[0]。
内容的提问来源于stack exchange,提问作者Cristina Dominguez Fernandez
相关产品推荐
相关产品推荐

