我有一个数据框,看起来像:
sensorId 1 2 3
9b:f3:55:19:00:4b:12:00 1 7 8
bf:f3:55:19:00:4b:12:00 6 5 9
da:f3:55:19:00:4b:12:00 1 1 2
并且我想用以下结构重构为数据框:
sensorId y
9b:f3:55:19:00:4b:12:00 1
9b:f3:55:19:00:4b:12:00 7
9b:f3:55:19:00:4b:12:00 8
bf:f3:55:19:00:4b:12:00 6
bf:f3:55:19:00:4b:12:00 5
bf:f3:55:19:00:4b:12:00 9
da:f3:55:19:00:4b:12:00 1
da:f3:55:19:00:4b:12:00 1
da:f3:55:19:00:4b:12:00 2
我尝试使用df.stack(),但结果并不乐观,因为它返回了pd.series:
9b:f3:55:19:00:4b:12:00 1 1
2 7
3 8
bf:f3:55:19:00:4b:12:00 1 6
2 5
3 9
da:f3:55:19:00:4b:12:00 1 1
2 1
3 2
答案 0 :(得分:5)
使用双Series.reset_index
-第一个用于删除第二级MultiIndex
,第二个用于将Series
转换为DataFrame
:
df = df.stack().reset_index(level=1, drop=True).reset_index(name='y')
print (df)
sensorId y
0 9b:f3:55:19:00:4b:12:00 1
1 9b:f3:55:19:00:4b:12:00 7
2 9b:f3:55:19:00:4b:12:00 8
3 bf:f3:55:19:00:4b:12:00 6
4 bf:f3:55:19:00:4b:12:00 5
5 bf:f3:55:19:00:4b:12:00 9
6 da:f3:55:19:00:4b:12:00 1
7 da:f3:55:19:00:4b:12:00 1
8 da:f3:55:19:00:4b:12:00 2
编辑:
由于df.stack
返回MultiIndex
,这意味着sensorId
不是列,而是索引。
如果sensorId
是列:
df = df.set_index('sensorId').stack().reset_index(level=1, drop=True).reset_index(name='y')
答案 1 :(得分:0)
或使用:
df = df.set_index('sensorId').stack().reset_index(name='y').drop('level_1',1)
还有@jezrael的一些更正(他很好):
df = df.set_index('sensorId').stack().reset_index(level=1, drop=True).reset_index(name='y')
现在:
print(df)
是:
sensorId y
0 9b:f3:55:19:00:4b:12:00 1
1 9b:f3:55:19:00:4b:12:00 7
2 9b:f3:55:19:00:4b:12:00 8
3 bf:f3:55:19:00:4b:12:00 6
4 bf:f3:55:19:00:4b:12:00 5
5 bf:f3:55:19:00:4b:12:00 9
6 da:f3:55:19:00:4b:12:00 1
7 da:f3:55:19:00:4b:12:00 1
8 da:f3:55:19:00:4b:12:00 2