首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于数据中多列条件选择的向量算法

基于数据中多列条件选择的向量算法
EN

Stack Overflow用户
提问于 2019-08-01 14:59:14
回答 2查看 32关注 0票数 1

我试图在我的数据中的不同单元之间做算术运算,但是我想不出如何对我的每个组进行操作。我试图在基线构建(在本例中upgrade_name == b是基线案例)和每一次升级(每个构建)之间找到energy_use的区别。我有任意数量的building_id和任意数量的upgrade_name

我可以在一个building_id上成功地做到这一点。现在,我需要将其扩展到完整的数据集中,然后陷入困境。我将拥有成千上万座建筑中的10座,每座建筑将有数十座升级。

Iterating within groups in Pandas这个问题的答案可能是相关的,但我不知道如何将它应用于我的问题。

我有这样的数据:

代码语言:javascript
复制
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]})
代码语言:javascript
复制
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,我有以下代码:

代码语言:javascript
复制
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):

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-01 18:04:58

定义计算能源使用差异的函数(对于当前建筑物的一组行)如下:

代码语言:javascript
复制
def euDiff(grp):
    euBase = grp[grp.upgrade_name == 'b'].energy_use.values[0]
    return grp.energy_use - euBase

然后计算差异(对于所有建筑物),并将其应用于每一组:

代码语言:javascript
复制
df['ideal'] = df.groupby('building_id').apply(euDiff)\
    .reset_index(level=0, drop=True)

结果和你预期的一样。

票数 1
EN

Stack Overflow用户

发布于 2019-08-01 18:02:54

谢谢你分享这个例子的数据!让事情变得简单多了。

我建议分两部分解决这一问题:

  1. 根据您的数据制作一个字典,其中包含每个建筑物的基准能源使用。
  2. 将lambda函数应用到您的数据中,从与该建筑相关的基线值中减去每个能源使用值。
代码语言:javascript
复制
# 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']])

您还可以编写一个函数来完成这个任务。你也不一定需要字典,它只会让事情变得更简单。如果您对这些替代解决方案感兴趣,请告诉我,我可以为您添加它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57311875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档