目前,我正在处理一个具有几百万行和8列的数据框,并试图在对此df进行转换时避免使用循环。
问题如下。
原始Pandas DataFrame的示例格式如下所示。这里的“索引”是日期时间,“房间”是分类时间,其他列是浮点数。
原始df:
这是一个数据帧中的传感器数据,其中每个日期时间索引值都有多个样本,因为有多个房间。目标列应采用以下格式。
请注意,我省略了“厨房和客厅”的栏目。您可能会实现目标。每个房间标签每个变量一列。
现在,使事情变得更复杂。在每个时间步中,并非所有可能的房间类别都可见。例如,示例df可能在20:05缺少“厨房”。
人们可以将这种转换(我想)看作是多个数据帧(每个房间一个df),它们被连接到相同的日期时间索引,其中每个列名都更改为sensor__room_category
。是否可以在不使用循环且不遍历整个df的情况下完成此转换?如果可以,怎么办?
另一件事,实际上,这个df由多个房屋的上述数据组成。因此,有一列带有“ house_1,house_2,house_3,...”标签。因此,仅应转换例如house_1的日期,然后转换house_2,等等。因此每个房屋的数据保持分离。
我知道这是一个非常具体的问题。但是我想知道是否有一些熊猫甚至Np魔术可以轻松实现。
TLDR:来自不同房间的传感器的数据需要转换,因此每个值sensor__room_category
都有一个时间戳。如何在没有大量循环的情况下做到这一点?
答案 0 :(得分:2)
这是一个例子
让我们假设这个以日期时间和房屋作为索引的多索引数据帧:
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