python - 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"))
(我已经简化了我的原始示例,以便更好地连接添加的第二个代码。)
解决方案
使用 exec(),eval() 是不同的
例如:
exec(f"variable_name{added_namepart} = variable_value{added_valuepart}")
推荐阅读
- c - 如何显示此堆栈结构中的每个元素?(C)
- python - 在 model_to_dict 中指定时间格式
- c# - 使用 NewtonsoftJSON 从 Spotify JSON 响应中获取 id
- laravel - 更新模型时如何在验证 API 中设置 Rule::unique()->ignore()?
- java - Java中状态模式的封装损坏
- php - 如何在url中指定城市
- java - Java - Rest API 场景
- python - 在使用 bs4 汤中找到第三个
- reactjs - 为什么这个 api 调用在 React 中被调用了两次?
- .net-core - .net 核心模型验证