首页 > 解决方案 > pandas groupby-aggregate 中动态创建字段名

问题描述

我的代码中有许多以下类型的聚合:

period = 'ag'
index = ['PA']
lvl = 'pa'
wm = lambda x: np.average(x, weights=dfdom.loc[x.index, 'pop'])
dfpa = dfdom[(dfdom['stratum_kWh'] !=8)].groupby(index).agg(
    pa_mean_ea_ag_kwh = ('mean_ea_'+period+'_kwh', wm),
    pa_pop = ('dom_pop', 'sum'))

建立聚合方程的右手边很简单。我还想动态构建聚合方程的左侧,以便“dom”、“ea”、“ag”和“kw/kwh/thm”都可以创建为变量输入并根据我使用的过程来使用米执行。这将显着减少需要编写的代码量,并且更新也将更易于管理,否则我需要为上述每种组合编写单独的其他相同的代码。

我可以使用 eval 来执行此操作吗?我很感激有关如何做到这一点的指导。谢谢。

添加根据 Vaidøtas I 的反馈编写的代码:

index = ['PA'] 
lvl = 'pa' 
fname = lvl+"_pop" 

b = f'dfdom.groupby({index}).agg({lvl}_pop = ("dom_pop", "sum"))' 
dfpab = exec(b) 

上面的输出是一个“NoneType 对象”。如果我提升变量 b 中的文本并直接运行如下所示的代码,我会得到一个数据框。

dfpab = dfdom.groupby(['PA']).agg(pa_pop = ("dom_pop", "sum"))

(我已经简化了我的原始示例,以便更好地连接添加的第二个代码。)

标签: pythonpandaspandas-groupbyaggregate

解决方案


使用 exec(),eval() 是不同的

例如:

exec(f"variable_name{added_namepart} = variable_value{added_valuepart}")

推荐阅读