用数据填充pandas Panel对象

时间:2014-05-02 15:38:49

标签: python pandas panel

这可能非常基本,但我似乎无法在任何地方找到解决方案。我试图在pandas中构建一个3D面板对象,然后用我从几个csv文件中读取的数据填充它。我尝试做的一个例子如下:

import numpy as np
import pandas as pd

year = np.arange(2000,2005)
obs = np.arange(1,5)
variables = ['x1','x2']

data = pd.Panel(items = obs, major_axis = year, minor_axis = variables)

因此data[i]为我提供了属于该小组中某个观察单位的所有数据:

data[1]
        x1      x2
2000    NaN     NaN
2001    NaN     NaN
2002    NaN     NaN
2003    NaN     NaN
2004    NaN     NaN

然后,我从csv中读取数据,它给我一个看起来像这样的DataFrame(我只是在这里创建一个等效对象,以使其成为一个有效的例子):

x1data = pd.DataFrame(data = zip(year, np.random.randn(5)), columns = ['year', 'x1'])
x1data
    year    x1
0   2000    -0.261514
1   2001    0.474840
2   2002    0.021714
3   2003    -1.939358
4   2004    1.167545

不,我想将x1 data[1]列中的NaN替换为x1data数据帧中的数据。我的第一个想法(假设我来自R)只是确保我从x1data中选择一个与我面板中的x1列具有相同尺寸的对象并将其分配给面板:

data[1].x1 = x1data.x1

然而,这不起作用,我猜是因为在x1data中,年份是数据帧的一列,而在面板中它们是显示在左侧的任何内容。列("行名称",这是一个索引)?

正如您可以从我的问题中可以看出,我真的不太了解熊猫数据结构中发生了什么,所以任何帮助都会非常感激!

1 个答案:

答案 0 :(得分:2)

我猜这个问题并没有引起很多回复,这简直太愚蠢了,但是万一有人遇到这个并且像我一样无能为力,那么非常简单的答案就是使用.iloc方法访问面板,如下:

data.iloc[item, major_axis, minor_axis]

其中每个参数可以是单个元素或列表,以便在面板的切片上写入。我上面的问题可以通过

解决
data.iloc[1, np.arange(2000,2005), 'x1'] = np.asarray(x1data.x1)

data.iloc[1, year, 'x1'] = np.asarray(x1data.x1)

请注意,我没有使用np.asarray,因为data.iloc[]创建了一个以年为索引的对象,而x1data.x1的索引从0开始,所以不会发生任何事情。