我有很多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
...
追加它们之后。这显然是将其转换为面板数据的糟糕结构。
我可以自己解决它 - 例如通过附加"正确的行"保持适当的结构或读取相同的文件多次,因为它有变量 - 但这将是麻烦和/或昂贵的。必须有方法可以轻松完成这项工作,但我无法在文档中找到它们。
感谢您的帮助。
答案 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