用于转换pandas DataSeries的函数是什么?

时间:2018-04-09 18:53:57

标签: python pandas

我想改造一只大熊猫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

enter image description here

结果列应该是“Pseudo-Id”的列值和旋转的相应列的组合。我必须避免使用分层标题。

这样做的最佳方式是什么? 我想到了枢轴功能。但我没有指定如何创建列名的选项。 我可以在旋转后创建新的列名。但问题可能是确定哪一列存在于行中,因为并非所有行都包含所有列。我可以用我之前创建的地图来解决这个问题。

还有其他我可能不知道的功能吗?也许有更优雅的方式: - )

1 个答案:

答案 0 :(得分:2)

您可以将unstackfill_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