透视和绘图数据

时间:2015-03-20 18:00:47

标签: python pandas

免责声明: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)

2 个答案:

答案 0 :(得分:1)

好的,我猜你得到了它,但是如果这有用(并且是@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

答案 1 :(得分:0)

看过原来的问题后,我认为你在拆散之后最好再加入。从原始问题中取出df,将其从status级别取消堆叠,然后从顶级列"var"中选择所有内容,然后然后进行加入已经完成了。

df.unstack("status")["var"].join(otherDf)

join()仍然足够聪明,可以与相应的索引匹配。如果您想要恰当地重命名foofubar,可以使用rename

df.rename(columns={'foo': 'var_foo', 'fubar': 'var_fubar'})