2016-06-24 2 views
1

スケジュール/レポートタイプを示す名前修飾子に基づいて、2001Q1から2016Q1までの一連のテキストファイルを取り込むプログラムを作成しています。修飾子はサブセットデータフレームの辞書を繰り返し使用

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

指定されたパスC(より良い名前の不足のために)キーと呼ばれている:\ファイルは、私が作成

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にコルン)、 (Schedule_RCO_2001Q1:のCol1 Col2にコルン) (Schedule_RI_2005Q2:Col1Col2ColN) }

のキー値配列である。

レポートの種類に基づいてメイン辞書から辞書を作成する必要があります。

は関係なく、key.stripまたはkey.strip()私は、エラーメッセージが表示される使用の
for key in keys: 
    for k in df_dict.keys(): 
     for v in df_dict.values(): 
      if key in k: 
       key.strip={k:v} 

、「『str』はオブジェクト属性 『ストリップ』は読み取りです:私は(私はそのアマチュアを知っている)、このスクリプトを思い付い「関数呼び出しに割り当てることはできません」、または「関数呼び出しに割り当てることはできません」。このタスクを達成するためのよりよい方法がありますか?私が集計辞書を作成した理由は、データの書式設定などを行うことです。辞書を壊すのを助けていただければ幸いです。

+0

あなたは 'key.strip = {k:v}'でどうしようとしていますか?キーは 'keys'の中でただ一つの値にすぎません。どうしてあなたは再びそれを初期化したいのですか? – oxalorg

+0

私はキーリストのキー要素を使って辞書を作成しようとしていました。キーリストの 'RI'要素にスペースがあるので、先頭と末尾のスペースを削除するためにstripを使用していました。私はRIがその名前でRIと一緒にすべてのスケジュール/レポートを含む辞書になることを望んでいました。 –

+0

それはまさに私が推測したものです。私の答えはあなたにとって完璧に働くはずです。 – oxalorg

答えて

1

key.stripでもkey.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 

出力:上記はunecessarily複雑と思われる場合は

>>> 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} 
+0

ありがとうございます、私はそれが明確ではないことには申し訳ありません。基本的に、「キー」リストの特定の要素に対応するDataFramesのみを含む別々の辞書を作成したいと考えています。たとえば、RCRII_dictには、df_dictディクショナリ内のすべての "Schedule_RCRII" DataFramesが含まれます。 –

+1

@RobertGarrison、その場合、私の答えはあなたのために完全に動作します。最初の解決策は '{'RI':{'RI_2010':値、 'Schedule_RI_2016Q1':value2}、 'RCD' ...} 'というように辞書を返します。 2番目の解決策は 'key'という名前の辞書を作成します。 – oxalorg

+1

@RobertGarrison答えを編集して出力例を追加しました。 – oxalorg

関連する問題