通过迭代

时间:2016-06-24 13:57:53

标签: python dictionary pandas iteration

我正在创建一个程序,根据指定计划/报告类型的名称限定符,从2001Q1到2016Q1摄取一系列文本文件。限定符被称为键(缺少更好的名称)

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'是只读的#34;或者"分别不能分配给函数调用"。有没有更好的方法来完成这项任务。我创建聚合字典的原因是做一些数据格式化等等。非常感谢帮助打破字典。

1 个答案:

答案 0 :(得分: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}