我试图在我的数据中的不同单元之间做算术运算,但是我想不出如何对我的每个组进行操作。我试图在基线构建(在本例中upgrade_name == b是基线案例)和每一次升级(每个构建)之间找到energy_use的区别。我有任意数量的building_id和任意数量的upgrade_name。
我可以在一个building_id上成功地做到这一点。现在,我需要将其扩展到完整的数据集中,然后陷入困境。我将拥有成千上万座建筑中的10座,每座建筑将有数十座升级。
Iterating within groups in Pandas这个问题的答案可能是相关的,但我不知道如何将它应用于我的问题。
我有这样的数据:
df = pd.DataFrame({'building_id': [1,2,1,2,1], 'upgrade_name': ['a', 'a', 'b', 'b', 'c'], 'energy_use': [100.4, 150.8, 145.1, 136.7, 120.3]})In [4]: df
Out[4]:
building_id upgrade_name energy_use
0 1 a 100.4
1 2 a 150.8
2 1 b 145.1
3 2 b 136.7
4 1 c 120.3对于单个building_id,我有以下代码:
upgrades = df.loc[df.building_id == 1, ['upgrade_name', 'energy_use']]
starting_point = upgrades.loc[upgrades.upgrade_name == 'b', 'energy_use']
upgrades['diff'] = upgrades.energy_use - starting_point.values[0]
In [8]: upgrades
Out[8]:
upgrade_name energy_use diff
0 a 100.4 -44.7
2 b 145.1 0.0
4 c 120.3 -24.8如何为任意数量的building_id而不是硬编码的building_id == 1编写此代码?理想的解决方案如下(不管基线差异是0还是NaN):
In [17]: df
Out[17]:
building_id upgrade_name energy_use ideal
0 1 a 100.4 -44.7
1 2 a 150.8 14.1
2 1 b 145.1 0.0
3 2 b 136.7 0.0
4 1 c 120.3 -24.8发布于 2019-08-01 18:04:58
定义计算能源使用差异的函数(对于当前建筑物的一组行)如下:
def euDiff(grp):
euBase = grp[grp.upgrade_name == 'b'].energy_use.values[0]
return grp.energy_use - euBase然后计算差异(对于所有建筑物),并将其应用于每一组:
df['ideal'] = df.groupby('building_id').apply(euDiff)\
.reset_index(level=0, drop=True)结果和你预期的一样。
发布于 2019-08-01 18:02:54
谢谢你分享这个例子的数据!让事情变得简单多了。
我建议分两部分解决这一问题:
# set index to building_id, turn into dictionary, filter out energy use
building_baseline = df[df['upgrade_name'] == 'b'].set_index('building_id').to_dict()['energy_use']
# apply lambda to dataframe, use axis=1 to access rows
df['diff'] = df.apply(lambda row: row['energy_use'] - building_baseline[row['building_id']])您还可以编写一个函数来完成这个任务。你也不一定需要字典,它只会让事情变得更简单。如果您对这些替代解决方案感兴趣,请告诉我,我可以为您添加它们。
https://stackoverflow.com/questions/57311875
复制相似问题