Python 透视和绘图数据

Python 透视和绘图数据,python,pandas,Python,Pandas,免责声明:,其中技巧建议(对于连接,根本不要取消堆栈)对该部分很有用,但最终我实际上出于各种原因(包括打印)想要取消堆栈 以下是我的数据: var1 var2 date status 2003-01-01 foo 69.037500 487.713615 fubar 69.037500 563.257104 2005-01-01 f

免责声明:,其中技巧建议(对于连接,根本不要取消堆栈)对该部分很有用,但最终我实际上出于各种原因(包括打印)想要取消堆栈

以下是我的数据:

                         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
(日期,状态)
特定的,但是
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

尝试:Pivot 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)

看到你原来的问题后,我认为你最好在解压后加入。从原始问题中提取
df
,沿着
状态
级别将其取消堆叠,然后从顶级列
“var”
中选择所有内容,然后在完成后进行连接

df.unstack("status")["var"].join(otherDf)
join()。如果要适当地重命名
foo
fubar
,可以使用
rename

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

好的,我想你明白了,但如果这是有帮助的(并且是@ASGM的一个变体):


如果您只是将索引从date/status更改为date/var1/status呢?或者,在你的轴心点后进行合并,以恢复丢失的列?@JohnE:这些听起来像是解决办法。如果没有更干净的方法来做这件事,是的,我会接受的,但我希望有更好的方法来做这件事…是的,他们只是权宜之计。我真的想不出一个办法让pivot做你想做的事。不过,我怀疑您使用堆栈/取消堆栈可能比使用pivot更幸运。@JohnE我设法解决了这个问题,但这花了我一些时间:我需要(I)将列重新转换为数据帧,(ii)使用联接,而不是合并/追加。差不多了!我将如何重塑这些文件,使其不具有堆叠的列名?我只需要一个级别,如
var1
var2_foo
var2_fuubar
。我正努力让这一切持续好几个小时。在一个扩展问题中,我有比
var1
更多的列,然后
unstack()
似乎是唯一的选择。我相信只要重命名列就行了。我会调整答案,我试过了。成功重命名第一层中的标签,但不删除这些层。是否通过如上所述的
df2.columns=
进行重命名?这为我删除了级别(将其展平),而
df.rename
没有。
df.rename(columns={'foo': 'var_foo', 'fubar': 'var_fubar'})
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