将数据帧的OrderedDict解压缩到python中的许多数据帧中

问题描述 投票:0回答:2

我想从包含许多数据表的Excel电子表格中读取和准备数据。

我首先使用pd.read_excelsheetname=None从excel文件中读取数据,以便所有工作表都可以写入price_data对象。

price_data = pd.read_excel('price_data.xlsx', sheetname=None)

这给了我一个包含5个数据帧的OrderedDict对象。之后我需要获得组成对象price_data的不同数据帧。我想为此使用for迭代,这使我有机会进行其他所需的迭代操作,例如设置数据帧的索引。这是我尝试过的方法

for key, df in price_data.items(): 
    df.set_index('DeliveryStart', inplace=True)
    key = df

使用这段代码,我希望每个数据帧都会被写入由key迭代器命名的对象中,最后我将拥有与原始data_price对象中的数据帧一样多的数据帧。但是我最终得到了两个相同的数据帧,一个名为key,另一个名为value。

建议?

python pandas dataframe ordereddictionary
2个回答
0
投票

当前行为的原因:

在您的示例中,将创建变量keydf(如果尚未存在)并在循环的每次迭代中覆盖。在每次迭代中,您将key设置为指向对象df(它也保留在df中,因为Python允许多个指针指向同一个对象)。但是,然后在下一个循环中覆盖key对象并将其设置为df的新值。在循环结束时,变量将保持其最后状态。

为了显示:

from collections import OrderedDict
od = OrderedDict()
od["first"] = "foo"
od["second"] = "bar"
# I've added an extra layer of `enumerate` just to display the loop progress. 
# This isn't required in your actual code.
for loop, (key, val) in enumerate(od.items()):
    print("Iteration: {}".format(loop))
    print(key, val)
    key = val
    print(key,val)
print("Final output:", key, val)

输出:

Iteration: 0
first foo
foo foo
Iteration: 1
second bar
bar bar
Final output: bar bar

解:

看起来你想要动态设置变量的名称与key的值相同,这不是一个好主意(即使它可以完成)。有关更多讨论,请参阅Dynamically set local variable

它听起来像一个dict,或者OrderedDict实际上是一个很好的格式,您可以将DataFrames与其源自的表格名称一起存储。实质上,您有一个容器,其中包含您要使用的命名属性。然后,您可以遍历项目以执行连接,过滤或类似工作。

如果您希望DataFrame在独立对象中有不同的原因,请留下评论,我会尝试提出后续建议。


0
投票

如果您乐意在原地设置DataFrame的索引,可以尝试这样做:

for key in price_data:
    price_data[key].set_index('DeliveryStart', inplace=True)
© www.soinside.com 2019 - 2024. All rights reserved.