免责声明: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
:
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)
答案 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()
仍然足够聪明,可以与相应的索引匹配。如果您想要恰当地重命名foo
和fubar
,可以使用rename
:
df.rename(columns={'foo': 'var_foo', 'fubar': 'var_fubar'})