用数据填充pandas面板对象
这可能是个非常基础的问题,但我到处找也没找到解决办法。我想在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开始的。