python熊猫,转换数据集,将行移动到列

时间:2019-10-11 14:18:22

标签: python pandas join merge concatenation

有一个csv数据框,其中包含按小时间隔的属性及其值。并非每小时都会列出所有属性。看起来像这样:

time                    attribute value
2019.10.11. 10:00:00    A           10
2019.10.11. 10:00:00    B           20
2019.10.11. 10:00:00    C           10
2019.10.11. 10:00:00    D           13
2019.10.11. 10:00:00    E           12
2019.10.11. 11:00:00    A           11
2019.10.11. 11:00:00    D           8
2019.10.11. 11:00:00    E           17
2019.10.11. 12:00:00    A           13
2019.10.11. 12:00:00    B           24
2019.10.11. 12:00:00    C           11
2019.10.11. 12:00:00    E           17

我想将其每小时转换为一行,并且属性名称应随列一起显示其值。如果未列出属性,则该属性应为零或也可以留为空白等。熊猫是否提供了一种通过合并,连续或联接或其他方式使其自动化的方法,还是我必须手动实现?

我需要以下格式的数据集:

time                    A   B   C   D   E
2019.10.11. 10:00:00    10  20  10  13  12
2019.10.11. 11:00:00    11  0   0   8   17
2019.10.11. 12:00:00    13  24  11  0   17

感谢您阅读!

2 个答案:

答案 0 :(得分:2)

使用DataFrame.pivot_table

df=df.pivot_table(columns='attribute',index='time' ,values ='value',fill_value=0)
print(df)

attribute              A   B   C   D   E
time                                   
2019.10.11. 10:00:00  10  20  10  13  12
2019.10.11. 11:00:00  11   0   0   8  17
2019.10.11. 12:00:00  13  24  11   0  17

答案 1 :(得分:1)

您可以使用unstack + fillna

df = pd.DataFrame(data=data, columns=['time', 'attribute', 'value'])
print(df.set_index(['time', 'attribute']).unstack(level=-1).fillna(0))

输出

                     value                        
attribute                A     B     C     D     E
time                                              
2019.10.11. 10:00:00  10.0  20.0  10.0  13.0  12.0
2019.10.11. 11:00:00  11.0   0.0   0.0   8.0  17.0
2019.10.11. 12:00:00  13.0  24.0  11.0   0.0  17.0