【问题标题】:How to assign a dataframe variable based on a dictionary key in a loop如何根据循环中的字典键分配数据框变量
【发布时间】:2020-01-30 04:41:02
【问题描述】:

我的搜索无法找到此问题的解决方案。我希望它很简单,只是错过了它。

我正在尝试根据字典键分配数据框变量。我想遍历键 0、1、2 3... 的字典并将数据帧保存为 df_0、df_1、df_2 ...我能够使键和值正常工作并可以分配一个数据帧,但找不到一种基于键分配新数据帧的方法。

我尝试了How to create a new dataframe with every iteration of for loop in Python,但它似乎不起作用。

这是我尝试过的:

docs_dict = {0: '2635_base', 1: '2635_tri'}

for keys, docs in docs_dict.items():
    print(keys, docs)
    df = pd.read_excel(Path(folder_loc[docs]) / file_name[docs], sheet_name=sheet_name[docs], skiprows=3)}

输出:来自 print 语句的 0 2635_base 1 2635_tri,%whos DataFrame > df 除外。

我想得到的是:df_0 和 df_1 基于其他字典中的 excel 文件,它们可以正常工作。

    df[keys] = pd.read_excel(Path(folder_loc[docs]) / file_name[docs], sheet_name=sheet_name[docs], skiprows=3)

产生一个 ValueError:传递的项目数错误 26,位置意味着 1

已解决感谢 RubenB 将我指向 How do I create a variable number of variables? 并由 @rocky-li 使用 globals() 回答

for keys, docs in docs_dict.items():
    print(keys, docs)
    globals()['df_{}'.format(keys)] = pd.read_excel(...)}

>> Output: dataframes df_0, df_1, ...

【问题讨论】:

  • 为什么不使用dfs = {},然后使用dfs[key] = ...
  • 我将dfs = {} 放在循环之前并将df[keys] 更改为dfs[keys] 并且运行时没有错误,但没有创建数据框。 %whos DataFrame 输出是:没有变量与您请求的类型匹配。

标签: python python-3.x pandas


【解决方案1】:

您可能想尝试这样的 dict 理解(替换 pd.read_excel(...docs...) 与从光盘读取数据帧所需的任何内容):

docs_dict = {0: '2635_base', 1: '2635_tri'}
dfs_dict = {k: pd.read_excel(...docs...) for k, docs in docs_dict.items()}

【讨论】:

  • 谢谢@RubenB 我能够理解字典,但我不确定如何在不硬编码的情况下自动获取数据帧 df_0 = dfs_dict[0] 和 df_1 = dfs_dict[1]。我想要df_0 和 df_1 和 df_x 视情况而定,以便我可以运行合并和列检查。基本上我想为每个读入的 excel 文件创建一个单独的 df。
  • 您想动态创建变量吗?这通常是不好的做法,对于合并和列检查来说不是必需的。看看stackoverflow.com/questions/1373164/…,看看为什么你不应该这样做。您最好使用数据框循环遍历可迭代对象并单独对它们执行任何操作。 Wrt 合并,请查看 stackoverflow.com/questions/38089010/… 以了解如何使用可迭代来执行此操作。
  • 宾果游戏。答案在 RockyLi 使用 globals()['df_{}'.format(keys)] = ... 的1373164 中。由于我没有足够的声誉,我无法支持您的回答 RubenB。希望有人可以代表我。
猜你喜欢
  • 2018-11-15
  • 1970-01-01
  • 2015-11-15
  • 2015-10-31
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
相关资源
最近更新 更多