用数据填充pandas面板对象

2 投票
1 回答
1193 浏览
提问于 2025-04-18 05:09

这可能是个非常基础的问题,但我到处找也没找到解决办法。我想在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

现在,我想把data[1]x1列的NaN值替换成在x1data数据框中的数据。我最初的想法(因为我之前用的是R)是确保从x1data中选择一个与面板中x1列维度相同的对象,然后把它赋值给面板:

data[1].x1 = x1data.x1

但是,这样做不行,我猜是因为在x1data中,年份是数据框的一列,而在面板中,它们是显示在列左边的东西(“行名”,这算是索引吗?)

从我的问题中你可能能看出来,我对pandas的数据结构还远没有完全理解,所以任何帮助都将非常感激!

1 个回答

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开始的。

撰写回答