将数据帧的 OrderedDict 解包为 python 中的许多数据帧
Unpacking an OrderedDict of data frames into many data frames in python
我想从包含许多数据表的 excel 电子表格中读取和准备数据。
我首先使用pd.read_excel
和sheetname=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
中的数据帧一样多的数据帧目的。但是我最终得到了两个相同的数据帧,一个命名键和一个命名值。
建议?
如果您愿意设置 DataFrame 的索引 in-place,您可以试试这个:
for key in price_data:
price_data[key].set_index('DeliveryStart', inplace=True)
当前行为的原因:
在您的示例中,变量 key
和 df
将被创建(如果尚不存在)并在循环的每次迭代中被覆盖。在每次迭代中,您将 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
的 value 相同,这不是一个好主意(即使虽然可以做到)。有关更多讨论,请参阅 Dynamically set local variable。
听起来像 dict
,或者 OrderedDict
实际上是一种很好的格式,您可以将 DataFrame 与它起源的 sheet 的名称一起存储。本质上,您有一个容器,其中包含您要使用的命名属性。然后,您可以遍历这些项目来完成串联、过滤或类似的工作。
如果您出于其他原因希望 DataFrames 位于独立对象中,请发表评论,我会尝试提出 follow-up 建议。
我想从包含许多数据表的 excel 电子表格中读取和准备数据。
我首先使用pd.read_excel
和sheetname=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
中的数据帧一样多的数据帧目的。但是我最终得到了两个相同的数据帧,一个命名键和一个命名值。
建议?
如果您愿意设置 DataFrame 的索引 in-place,您可以试试这个:
for key in price_data:
price_data[key].set_index('DeliveryStart', inplace=True)
当前行为的原因:
在您的示例中,变量 key
和 df
将被创建(如果尚不存在)并在循环的每次迭代中被覆盖。在每次迭代中,您将 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
的 value 相同,这不是一个好主意(即使虽然可以做到)。有关更多讨论,请参阅 Dynamically set local variable。
听起来像 dict
,或者 OrderedDict
实际上是一种很好的格式,您可以将 DataFrame 与它起源的 sheet 的名称一起存储。本质上,您有一个容器,其中包含您要使用的命名属性。然后,您可以遍历这些项目来完成串联、过滤或类似的工作。
如果您出于其他原因希望 DataFrames 位于独立对象中,请发表评论,我会尝试提出 follow-up 建议。