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