我想改造一只大熊猫DataSeries,我不确定最佳解决方案是什么。
例如:我有一个这样的表:
Pseudo-id|Time |Name|Key |Attr |Value | Unit
1 |10:00 |A |Value|height|10 | mm
2 |10:00 |A |Value|width |20 | mm
1 |11:00 |B |Value|height|10 | mm
3 |11:00 |B |Value|depth |20 | mm
我想获得结果(稀疏)表,如下所示(文本和图像版本:-))。
Time |Name|Key1 |Attr1 |Value1|Unit1|Key2 |Attr2|Value2|Unit2|Key3 |Attr3|Value3|Unit3
10:00|A |Value|height|10 |mm |Value|width|20 |mm |- |- |- |-
11:00|B |Value|height|10 |mm |- |- |- |- |Value|depth|20 |mm
结果列应该是“Pseudo-Id”的列值和旋转的相应列的组合。我必须避免使用分层标题。
这样做的最佳方式是什么? 我想到了枢轴功能。但我没有指定如何创建列名的选项。 我可以在旋转后创建新的列名。但问题可能是确定哪一列存在于行中,因为并非所有行都包含所有列。我可以用我之前创建的地图来解决这个问题。
还有其他我可能不知道的功能吗?也许有更优雅的方式: - )
答案 0 :(得分:2)
您可以将unstack
与fill_value
s=df.set_index(['Time','Name','id']).unstack(fill_value='').sort_index(level=1,axis=1)
s.columns=s.columns.map('{0[0]}{0[1]}'.format)
s
Out[88]:
Key1 Attr1 Value1 unit1 Key2 Attr2 Value2 unit2 Key3 Attr3 \
Time Name
10 A value h 10 mm value w 20 mm
11 B value h 10 mm value d
Value3 unit3
Time Name
10 A
11 B 20 mm
数据输入
df
Out[89]:
id Time Name Key Attr Value unit
0 1 10 A value h 10 mm
1 2 10 A value w 20 mm
2 1 11 B value h 10 mm
3 3 11 B value d 20 mm