【问题标题】:Pandas, transforming rows that have the same datetime index value熊猫,转换具有相同日期时间索引值的行
【发布时间】:2018-11-22 19:26:44
【问题描述】:

目前,我正在处理数百万行和 8 列的数据框,并试图在对此 df 进行转换时避免使用循环。

问题如下。

原始 Pandas DataFrame 的示例格式如下所示。这里的“索引”是日期时间,“房间”是分类的,其他列是浮点数。

原始df:

这是一个数据帧中的传感器数据,每个日期时间索引值有多个样本,因为有多个房间。目标列应采用以下格式。

请注意,我省略了“厨房和客厅”的列。你可能会达到目标。每个变量,每个房间标签一列。

现在,让事情变得更复杂。在每个时间步长中,并非所有可能的房间类别都是可见的。例如,在 20:05,示例 df 中可能缺少“厨房”。

可以将这种转换(我猜)视为多个数据帧(每个房间一个 df),在同一个日期时间索引上连接,其中每个列名称更改为 sensor__room_category。这种转换可以在不使用循环和迭代整个 df 的情况下完成吗?如果有,怎么做?

另一件事,实际上这个df由来自多个房屋的上述数据组成。所以有一列带有“house_1,house_2,house_3,...”标签。因此,仅应转换例如 house_1 的日期,然后是 house_2 等...所以每个房子的数据保持分离。

我知道这是一个非常具体的问题。但我想知道是否有一些 Pandas 甚至 np 魔法可以轻松实现。

TLDR:来自不同房间的传感器的数据需要进行转换,因此每个值 sensor__room_category 都有一个时间戳。如何在没有大量循环的情况下做到这一点?

【问题讨论】:

  • 我猜这可以通过创建一个过滤器掩码 (df[df[timestamp==value]]) 来完成,这样您就可以为您感兴趣的每个时间戳创建一个新的 df仅列出具有该时间戳数据的房间,但我不确定我是否理解您的预期输出。无论如何,即使在没有自己实现任何东西的情况下使用 Pandas 函数,也会发生循环,因此如果速度至关重要,您可以尝试将 Pandas 函数链接在一起,直到得到结果,但在其他情况下,实现您的特定解决方案可能更容易但更耗时
  • 我只需将您的日期时间和房屋列设置为索引,然后执行df.pivot('Room') 这将为您提供一个多索引数据框,可以完成您正在寻找的内容......大部分

标签: python pandas numpy indexing transformation


【解决方案1】:

这是一个例子

让我们假设这个以日期时间和房屋为索引的多索引数据框:

                         co2 humidity presence  room
index            house              
22/11/2018 20:00 house1 102    60        0  bedroom1
                 house1 104    62        0  bedroom2
                 house1 122    71        1  kitchen
                 house1 115    61        1  living room
22/11/2018 20:05 house1 103    64        0  bedroom1
                 house1 104    68        0  bedroom2
                 house1 123    72        1  kitchen
                 house1 111    63        1  livingroom
22/11/2018 20:00 House2 102    60        0  bedroom1
                 House2 104    62        0  bedroom2
                 House2 122    71        1  kitchen
                 House2 115    61        1  living room
22/11/2018 20:05 House2 103    64        0  bedroom1
                 House2 104    68        0  bedroom2
                 House2 123    72        1  kitchen
                 House2 111    63        1  livingroom

你可以简单地做df.pivot(columns='room'):

                         co2                                humidity                                    presence
                  room  bedroom1    bedroom2    kitchen living room bedroom1    bedroom2    kitchen living room bedroom1    bedroom2    kitchen living room
index             house                                             
22/11/2018 20:00  House2    102       104        122         115        60          62          71      61          0           0           1       1
                  house1    102       104        122         115        60          62          71      61          0           0           1       1
22/11/2018 20:05  House2    103       104        123         111        64          68          72      63          0           0           1       1
                  house1    103       104        123         111        64          68          72      63          0           0           1       1

【讨论】:

  • 您可以在之后用df.columns = ['{}_{}'.format(var,room) for var, room in df.columns] 重命名列,最终得到我认为的 OP 预期输出
  • @Ben.T 是的,你可以这样做。很好的补充。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-15
  • 2016-06-03
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多