使用Panel进行现场值设置的问题

时间:2014-05-06 14:46:00

标签: python pandas

从Dataframes到面板的值设置数据存在实际问题,将用一些代码解释

import numpy as np
from pandas import *
foo = DataFrame(np.nan,index=date_range('2014-05-01','2014-05-8'),columns=['a','b'])
bar= Panel({'foob':foo.copy(),'barb':foo.copy()})
foo[:]=1.0
好的,所以下面的这两个按预期工作......

bar.ix['foob',0,0] = foo.ix[0,0].copy()
bar.ix['foob',:,:]
bar.ix['foob',:,0] = foo.ix[:,0].copy()
bar.ix['foob',:,:]

但是当我尝试设置整个'foob'项目(Dataframe)时,它会将值重置为nan的

bar.ix['foob',:,:] = foo.ix[:,:].copy()
bar.ix['foob',:,:]

             a   b
2014-05-01 NaN NaN
2014-05-02 NaN NaN
2014-05-03 NaN NaN
2014-05-04 NaN NaN
2014-05-05 NaN NaN
2014-05-06 NaN NaN
2014-05-07 NaN NaN
2014-05-08 NaN NaN

问题是......我正在尝试使用另一个数据对象的索引值在Panel上设置值,但是我得到一个ValueError:数组不可广播以修正形状,这与形状看起来很奇怪一样吗?

bar.ix['foob',foo.index[1:],foo.columns[1:]] = foo.ix[foo.index[1:],foo.columns[1:]].copy()
通过创建一个新的数据框对象(在这种情况下为foobar),对其进行索引值设置,就像一个魅力,然后替换整个项目,有一个解决方法,但它不理想(特别是对于大型结构)小组

foobar = bar.ix['foob',:,:].copy()
foobar.ix[foo.index[1:],foo.columns[1:]] = foo.ix[foo.index[1:],foo.columns[1:]]
bar['foob'] = footer
bar['foob']

             a   b
2014-05-01 NaN NaN
2014-05-02 NaN   1
2014-05-03 NaN   1
2014-05-04 NaN   1
2014-05-05 NaN   1
2014-05-06 NaN   1
2014-05-07 NaN   1
2014-05-08 NaN   1

有人知道如何使用上面另一个数据对象的索引设置Panel的值,而不必创建新的Dataframe,非常感谢

1 个答案:

答案 0 :(得分:2)

对于您的具体示例,这将起作用

In [12]: bar['foob'] = foo.ix[:,:].copy()
# bar.ix['foob'] also works

In [13]: bar.values
Out[13]: 
array([[[ nan,  nan],
        [ nan,  nan],
        [ nan,  nan],
        [ nan,  nan],
        [ nan,  nan],
        [ nan,  nan],
        [ nan,  nan],
        [ nan,  nan]],

       [[  1.,   1.],
        [  1.,   1.],
        [  1.,   1.],
        [  1.,   1.],
        [  1.,   1.],
        [  1.,   1.],
        [  1.,   1.],
        [  1.,   1.]]])

当你指定多个轴索引器(:)时,这个发送理论上应该对它们进行相同处理,可能是潜伏的错误。