【问题标题】:Subset a dictionary of dataframes through iteration通过迭代子集数据帧字典
【发布时间】:2016-10-27 04:18:12
【问题描述】:

我正在创建一个程序,根据指示计划/报告类型的名称限定符来提取从 2001 年第一季度到 2016 年第一季度的一系列文本文件。限定符被称为键(因为没有更好的名字)

keys=[' RI ','RCD','RCF','RCG','RCH','RCL','RCO','RCRII']

给定路径 C:\files,我创建一个包含所有符合条件的文本文件的字典

files=[]
for k in keys:
    for i in os.listdir(path):
        if os.path.isfile(os.path.join(path,i)) and k in i:
            files.append(i)

然后我创建一个字典

    df_dict={file[:-4].replace(" ","_"):pd.read_table(path+file,header=[0,1],index_col=0,error_bad_lines=False,dtype={'IDRSSD':object}, low_memory=False) for file in files}

示例字典如下所示: {(Schedule_RI_2001Q1:Col1 Col2 ColN), (Schedule_RCO_2001Q1:Col1 Col2 ColN), (Schedule_RI_2005Q2:Col1 Col2 ColN) }

在键值排列中。

我需要根据报告类型从主词典创建词典。我想出了这个脚本(我知道它是业余的):

for key in keys:
    for k in df_dict.keys():
        for v in df_dict.values():
            if key in k:
                key.strip={k:v}

无论使用 key.strip 还是 key.strip(),我都会收到一条错误消息,分别是“'str' 对象属性 'strip' 是只读的”或“无法分配给函数调用”。有没有更好的方法来完成这项任务。我创建聚合字典的原因是为了进行一些数据格式化等。我们将不胜感激协助分解字典。

【问题讨论】:

  • 你到底想用key.strip = { k : v }做什么。 key只是keys中的一个值,为什么还要重新初始化呢?
  • 我试图使用键列表中的键元素创建字典。键列表中的 ' RI ' 元素有空格,所以我使用 strip 来删除前导和尾随空格。我希望 RI 成为一本字典,其中包含以 RI 为名的所有日程安排/报告。
  • 这正是我的猜测。我的回答应该很适合你。

标签: python dictionary pandas iteration


【解决方案1】:

您不能直接在key.stripkey.strip() 上创建字典,因为它们是函数。但是,您可以创建一个临时字典,并将这些函数返回的值用作临时字典中的键。

这是一种相对安全的方法:

keys = ['a', 'b']
df_dict = { 'a_2010': 1, 'a_2007': 2, 'Schedule_b_2009Q1': 3 }

for key in keys:
    sub_dict[key.strip()] = {}
    for k, v in df_dict.items():
        if key in k:
            sub_dict[key.strip()][k] = v 

输出:

>>> sub_dict
{'a': {'a_2007': 2, 'a_2010': 1},
 'b': {'Schedule_b_2009Q1': 3}}

如果上面看起来过于复杂,您可以简单地使用locals() 来解决这个特定问题(但在任何地方都使用它通常不是一个好习惯):

keys = ['a', 'b', 'c']
df_dict = { 'a_2010': 1, 'a_2007': 2, 'Schedule_b_2009Q1': 3 }

for key in keys:
    locals()[key.strip()] = {}
    for k, v in df_dict.items():
        if key in k:
            locals()[key.strip()][k] = v  

输出:

>>> a
{'a_2007': 2, 'a_2010': 1}
>>> b
{'Schedule_b_2009Q1': 3}

【讨论】:

  • 谢谢,很抱歉没有说清楚。我本质上想创建单独的字典,只包含对应于“键”列表中某个元素的 DataFrame。例如,RCRII_dict 将包含 df_dict 字典中的所有“Schedule_RCRII”数据帧。
  • @RobertGarrison,如果是这样,我的回答将非常适合您。第一个解决方案将返回一个字典,如下{ 'RI': { 'RI_2010': value, 'Schedule_RI_2016Q1': value2 }, 'RCD' ... } 依此类推。第二种解决方案将创建名称为 key 的字典。
  • @RobertGarrison 编辑了答案以包含示例输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-03
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
相关资源
最近更新 更多