Pandas 从中的多索引创建数据帧
这是我第一次使用.h5格式的数据集,我使用下面的代码为其分配键给一个新变量Pandas 从中的多索引创建数据帧,pandas,dataframe,merge,multi-index,Pandas,Dataframe,Merge,Multi Index,这是我第一次使用.h5格式的数据集,我使用下面的代码为其分配键给一个新变量 # Assign every meter to a variable house3_aggregate = ukdale.get('/building3/elec/meter1') house3_kettle = ukdale.get('/building3/elec/meter2') house3_electric_heater = ukdale.get('/building3/elec/meter3') hous
# Assign every meter to a variable
house3_aggregate = ukdale.get('/building3/elec/meter1')
house3_kettle = ukdale.get('/building3/elec/meter2')
house3_electric_heater = ukdale.get('/building3/elec/meter3')
house3_laptop = ukdale.get('/building3/elec/meter4')
house3_projector = ukdale.get('/building3/elec/meter5')
house3_aggregate = house3_aggregate.to_frame()
print(house3_aggregate)
打印第一个变量可以得到以下结构:
print(house3_aggregate)
physical_quantity power
type apparent
2013-02-27 20:35:14+00:00 5.0
2013-02-27 20:35:20+00:00 4.0
2013-02-27 20:35:26+00:00 5.0
2013-02-27 20:35:32+00:00 5.0
2013-02-27 20:35:38+00:00 4.0
... ...
2013-04-08 06:14:22+01:00 168.0
2013-04-08 06:14:28+01:00 171.0
2013-04-08 06:14:34+01:00 176.0
2013-04-08 06:14:40+01:00 174.0
2013-04-08 06:14:53+01:00 3122.0
512327 rows × 1 columns
使用.columns更好地理解我在这里看到的内容后,我得到以下输出:
MultiIndex([('power', 'apparent')],
names=['physical_quantity', 'type'])
我想将此数据集转换为只有两列的数据集,如下所示
Timestamp Energy Consumption
2013-02-27 20:35:14+00:00 5.0
2013-02-27 20:35:20+00:00 4.0
2013-02-27 20:35:26+00:00 5.0
2013-02-27 20:35:32+00:00 5.0
2013-02-27 20:35:38+00:00 4.0
... ...
2013-04-08 06:14:22+01:00 168.0
2013-04-08 06:14:28+01:00 171.0
2013-04-08 06:14:34+01:00 176.0
2013-04-08 06:14:40+01:00 174.0
2013-04-08 06:14:53+01:00 3122.0
512327 rows × 1 columns
我找到了post,并尝试像这样实现代码
house3_aggregate = house3_aggregate.reset_index()
print(house3_aggregate)
这给了我以下输出
physical_quantity index power
type apparent
0 2013-02-27 20:35:14+00:00 5.0
1 2013-02-27 20:35:20+00:00 4.0
2 2013-02-27 20:35:26+00:00 5.0
3 2013-02-27 20:35:32+00:00 5.0
4 2013-02-27 20:35:38+00:00 4.0
... ... ...
512322 2013-04-08 06:14:22+01:00 168.0
512323 2013-04-08 06:14:28+01:00 171.0
512324 2013-04-08 06:14:34+01:00 176.0
512325 2013-04-08 06:14:40+01:00 174.0
512326 2013-04-08 06:14:53+01:00 3122.0
[512327 rows x 2 columns]
除了错误的列命名,这似乎是我需要的。除此之外,我再次调用。列。数据似乎仍然是一个多索引
house3_aggregate.columns
MultiIndex([('index', ''),
('power', 'apparent')],
names=['physical_quantity', 'type'])
我也尝试了这种方法,并使用了下面的代码
# Assign every meter to a variable
house3_aggregate = ukdale.get('/building3/elec/meter1')
house3_kettle = ukdale.get('/building3/elec/meter2')
house3_electric_heater = ukdale.get('/building3/elec/meter3')
house3_laptop = ukdale.get('/building3/elec/meter4')
house3_projector = ukdale.get('/building3/elec/meter5')
house3_aggregate = house3_aggregate.to_frame()
print(house3_aggregate)
这给了我以下的错误
AttributeError: 'DataFrame' object has no attribute 'to_frame'
我现在很困惑,因为这个错误使数据看起来已经是二维的了。你知道我应该做些什么来摆脱多重索引并在下面这样的二维数据框架中转换数据吗?最后,我想使用pd.concat将所有变量合并到house3的单个数据集中
Timestamp Energy Consumption
2013-02-27 20:35:14+00:00 5.0
2013-02-27 20:35:20+00:00 4.0
2013-02-27 20:35:26+00:00 5.0
2013-02-27 20:35:32+00:00 5.0
2013-02-27 20:35:38+00:00 4.0
... ...
2013-04-08 06:14:22+01:00 168.0
2013-04-08 06:14:28+01:00 171.0
2013-04-08 06:14:34+01:00 176.0
2013-04-08 06:14:40+01:00 174.0
2013-04-08 06:14:53+01:00 3122.0
512327 rows × 1 columns
数据帧由三部分组成:索引、列和值。您可以在数据框中看到:
Out[31]:
physical_quantity power
type apparent
2013-02-27 20:35:14+00:00
2013-02-27 20:35:20+00:00 4.0
2013-02-27 20:35:26+00:00 5.0
2013-02-27 20:35:32+00:00 5.0
2013-02-27 20:35:38+00:00 4.0
In [38]: df.index
Out[38]:
Index(['2013-02-27 20:35:20+00:00', '2013-02-27 20:35:26+00:00',
'2013-02-27 20:35:32+00:00', '2013-02-27 20:35:38+00:00'],
dtype='object', name='index')
In [34]: df.columns
Out[34]:
MultiIndex([('power', 'apparent')],
names=['physical_quantity', 'type'])
In [32]: df.values
Out[32]:
array([[4.],
[5.],
[5.],
[4.]])
只要尺寸保持一致,您可以随意设置每一个。索引必须与行数一样大,列数必须与列数相对应
多索引只包含每个列值的元组。如果您希望能够轻松地选择数据帧的子集,这可能非常有用
您想覆盖列名。首先,为了“查看”索引名称(在我的示例中,我将其设置为'index'
),您可以使用reset\u index
In [39]: df = df.reset_index()
Out[39]:
physical_quantity index power
type apparent
0 2013-02-27 20:35:20+0... 4.0
1 2013-02-27 20:35:26+0... 5.0
2 2013-02-27 20:35:32+0... 5.0
3 2013-02-27 20:35:38+0... 4.0
In [41]: df.columns
Out[41]:
MultiIndex([('index', ''),
('power', 'apparent')],
names=['physical_quantity', 'type'])
如您所见,列的长度现在为2。现在您可以用
In [42]: df.columns = ['Timestamp', 'Energy Consumption']
In [43]: df
Out[43]:
Timestamp Energy Consumption
0 2013-02-27 20:35:20+0... 4.0
1 2013-02-27 20:35:26+0... 5.0
2 2013-02-27 20:35:32+0... 5.0
3 2013-02-27 20:35:38+0... 4.0
太棒了,非常感谢你!