将多个DataFrame转换为面板

时间:2016-08-09 12:35:47

标签: python pandas panel-data

我有很多excel文件。这些文件中的每一个都包含一个或多个变量,适用于某个时间点的所有主题。对于每个变量,我有10个文件(在10个不同的时间点存储变量的值)。我的最终目标是建立一个小组系列。

假设每个文件中只有一个变量。对于每个变量(或项目),我初始化一个空的DataFrame item = pd.DataFrame()并连续读取并将所有10个文件追加到该空DataFrame item = item.append(pd.DataFrame(df))中,其中df来自新文件。这10个DataFrame中的每一个都具有维度1 x #subjects,因此我最终拥有10 x #subject。我使用pf = pd.Panel({'variable name': item})将其转换为面板框架。现在,我可以轻松地将其添加到包含许多其他项目的大型面板框架中......

问题:如果每个文件中有2个或更多变量,那么解决此问题的简单实用的方法是什么?如果我坚持上述方法,我会为每个文件都有一个维度#variables x #subjects的DataFrame,导致

                 subject1    subject2
variable1 2000        val         val
variable2 2000        val         val
variable1 2001        val         val
variable2 2001        val         val
...

追加它们之后。这显然是将其转换为面板数据的糟糕结构。

我可以自己解决它 - 例如通过附加"正确的行"保持适当的结构或读取相同的文件多次,因为它有变量 - 但这将是麻烦和/或昂贵的。必须有方法可以轻松完成这项工作,但我无法在文档中找到它们。

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

Panel本质上是一堆DataFrame个对象,允许以三维方式探索数据。因此,只要每个文件只代表一个时间点,每个文件中表示的变量或主题数量无关紧要。将每个文件导入DataFrame,然后创建Panel

这可以通过在文件名列表上使用for循环来实现。在循环中,您可以检查数据来自哪一年,并将结果存储在包含所有其他DataFrame对象的字典中,从而使您可以轻松地将数据帧字典转换为面板。

如果您的原始DataFrame格式如下所示:

      Gerald  Kate
Var1       1     5
Var2       2     6
Var3       3     7
Var4       4     8

然后,您可以使用以下内容创建Panel

pn=pd.Panel(data={2010:df2010, 2015:df2015, 2020:df2020})

这是一个Panel,其属性为:

Dimensions: 3 (items) x 4 (major_axis) x 2 (minor_axis)
Items axis: 2010 to 2020
Major_axis axis: Var1 to Var4
Minor_axis axis: Gerald to Kate

可以按年分割:

print(pn[2015])


      Gerald  Kate
Var1       3    15
Var2       6    18
Var3       9    21
Var4      12    24

也可以切换轴以更好地查看单个变量或主题:

print(pn.transpose('minor_axis','major_axis','items')['Gerald'])

      2010  2015  2020
Var1     1     3     9
Var2     2     6    18
Var3     3     9    27
Var4     4    12    36