免责声明:I had posted a related question previously,提示的技巧(对于连接根本不要拆栈)对于该部分很有用,但最后我实际上出于各种原因(包括绘图)想拆栈。

所以这是我的数据:

                         var1        var2
date       status
2003-01-01 foo      69.037500  487.713615
           fubar    69.037500  563.257104
2005-01-01 foo      69.833333  479.454816
           fubar    69.833333  630.014694
2007-01-01 foo      69.137500  465.405122


请注意,var2是特定于(date, status)的,但是var1仅特定于给定的日期-两种状态都相同。

因此,尽管它是2个状态和2个变量,但实际上只有3个时间序列。我想重新格式化数据框以反映这一点。我想要的输出是

                var1    var2_foo var2_fubar
date
2003-01-01 69.037500  487.713615 563.257104
2005-01-01 69.833333  479.454816 630.014694
2007-01-01 69.137500  465.405122        NaN


然后我可以使用相关比例很好地绘制这些

df.plot(secondary_y = ['var1'])


我在另一个问题中部分描述了我尝试获得此结果的方法,但是我尝试的一种特别方法是pivot

尝试:透视var2,然后再次合并

df1 = df.reset_index().pivot(index='date', columns='status', values='var2' )


几乎可以正常工作,但是它完全删除了另一列。

status             foo       fubar
date
2003-01-01  487.713615  563.257104
2005-01-01  479.454816  630.014694
2007-01-01  465.405122  565.706308
2009-01-01  440.538986  465.306299
2011-01-01  420.217694  419.310829
2013-01-01  439.222659  618.119540


这是我后来合并的尝试:

df2 = aggStandard.reset_index(level=1)['var1']
date
2003-01-01    69.037500
2003-01-01    69.037500
2005-01-01    69.833333
2005-01-01    69.833333
2007-01-01    69.137500
Name: var1, dtype: float64
pd.merge(df1,df2)
AttributeError: 'Series' object has no attribute 'columns'
foo.join(bar)
TypeError: Argument 'left' has incorrect type (expected numpy.ndarray, got Index)

最佳答案

好的,我想您已经明白了,但是万一这很有用(并且是@ASGM做的一个变体):

In [67]: df2 = df.unstack('status').iloc[:,1:]

In [68]: df2.columns = [['var1','var2_foo','var2_fubar']]

In [69]: df2
Out[69]:
                 var1    var2_foo  var2_fubar
date
2003-01-01  69.037500  487.713615  563.257104
2005-01-01  69.833333  479.454816  630.014694
2007-01-01        NaN  465.405122         NaN

关于python - 数据透视图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29172976/

10-12 16:59
查看更多