2017-02-15 7 views
0

私はこの作業をテキストファイルに印刷したいのです。このファイルには、ヘッダー情報と特定の名前のデータ列が含まれています。コードは次のとおりです。forループ内の複数の未知の変数をループする良い方法はありますか?

import numpy as np 

data={'dpr_NS_corZFac': [np.nan, np.nan, 35.736231803894043, 36.331412792205811, 
       35.694644451141357, 36.576189994812012, 37.236752510070801, 
       38.173699378967285, 38.808069229125977, 36.761274337768555, 
       30.194313526153564], 
    'dpr_HS_corZFac': [np.nan, 38.550984859466553, 37.893826961517334, 40.246520042419434, 
      39.204437732696533, 37.227160930633545, 37.364296913146973, 
      40.320019721984863, 39.04454231262207, 33.014707565307617, 
      27.193448543548584], 
    'npol':[np.nan, np.nan, 35.736231803894043, 36.331412792205811, 
       35.694644451141357, 36.576189994812012, 37.236752510070801, 
       38.173699378967285, 38.808069229125977, 36.761274337768555, 
       30.194313526153564] } 

datafile_path = '/home/cpabla/data/pandastext.txt' 

with open(datafile_path, 'w+') as f: 
    f.write('Charanjit is writing this text file.') 
    f.write('\t'*4) 
    f.write('He continues to write....\n') 
    for tag in data: 
     f.write('{}\t\t'.format(tag)) 
    f.write('\n') 
    for val1, val2, val3 in zip(data['dpr_NS_corZFac'], data['dpr_HS_corZFac'], data['npol']): 
     if np.isnan(val1): val1 = 99.99 
     if np.isnan(val2): val2 = 99.99 
     if np.isnan(val3): val3 = 99.99 
     f.write('{:.2f}'.format(val1)) 
     f.write('\t'*7) 
     f.write('{:.2f}'.format(val2)) 
     f.write('\t'*7) 
     f.write('{:.2f}'.format(val3)) 
     f.write('\t'*7) 
     f.write('\n') 

コードの詳細は重要ではありません。これは単に私の目的でテストするためのものです。どのように私はリストの辞書を持っていることに注意してください。私は辞書に未知の量のリストを持ち、例の出力に与えられたforのテキストファイルを生成したい。しかし、どのように私は複数の変数(この場合は私の辞書のリスト)をループすることに注意してください。私は明らかにこれを自動化したいので、forループに変数を追加し続ける必要はありません。だからこれを行うには良い方法がありますか?ここで

が出力されます。

Charanjit is writing this text file.    He continues to write.... 
dpr_HS_corZFac  dpr_NS_corZFac  npol 
99.99       99.99       99.99 
99.99       38.55       99.99 
35.74       37.89       35.74 
36.33       40.25       36.33 
35.69       39.20       35.69 
36.58       37.23       36.58 
37.24       37.36       37.24 
38.17       40.32       38.17 
38.81       39.04       38.81 
36.76       33.01       36.76 
30.19       27.19       30.19 

テキストエディタへの実際の出力は、しかし、このようではありません。各列には、自分のヘッダー名の下にあります。出力は単に私がしようとしていることを示すことです。

+0

おそらくあなたは、彼らがwouldnその後、juanpa.arrivillaga @ 'ジップ(data.values())' –

+0

をしたいですどんな特定の順序でもありません。 – Duncan

+0

はい、注文は私にとって重要です。私はそれが私が辞書のデータを定義した方法です。 –

答えて

0

一つの解決策は次のようになります。

for k in data.keys(): 
    for val in data[k] : 
     if np.isnan(val): val = 99.99 
      f.write('{:.2f}'.format(val)) 
      f.write('\t'*7) 
     f.write('\n') 

編集:あなたは右Akasolace、私は私のコードあなたがパンダを使用することはでき

+1

' data.keys() 'を反復処理しないでください。これはPython 3では冗長にすぎません。Python 2では効率が悪いです。この場合、 'data.values()'にサブリストを入れたいかもしれませんが、 –

0
import numpy as np 

data={'dpr_NS_corZFac': [np.nan, np.nan, 35.736231803894043, 36.331412792205811, 
       35.694644451141357, 36.576189994812012, 37.236752510070801, 
       38.173699378967285, 38.808069229125977, 36.761274337768555, 
       30.194313526153564], 
    'dpr_HS_corZFac': [np.nan, 38.550984859466553, 37.893826961517334, 40.246520042419434, 
      39.204437732696533, 37.227160930633545, 37.364296913146973, 
      40.320019721984863, 39.04454231262207, 33.014707565307617, 
      27.193448543548584], 
    'npol':[np.nan, np.nan, 35.736231803894043, 36.331412792205811, 
       35.694644451141357, 36.576189994812012, 37.236752510070801, 
       38.173699378967285, 38.808069229125977, 36.761274337768555, 
       30.194313526153564] } 

datafile_path = r'D:\TEMP\pandastext.txt' 

with open(datafile_path, 'w+') as f: 
    f.write('Charanjit is writing this text file.') 
    f.write('\t'*4) 
    f.write('He continues to write....\n') 
    for tag in data: 
     f.write('{}\t\t'.format(tag)) 
    f.write('\n') 
    for vals in zip(data['dpr_NS_corZFac'], data['dpr_HS_corZFac'], data['npol']): 
     for val in vals: 
      if np.isnan(val): val = 99.99 
      f.write('{:.2f}'.format(val)) 
      f.write('\t'*7) 
     f.write('\n') 
+0

私の答えは上記と似ています... f.write( '\ n')を除いて私は内側のループの外側ですべきだと信じています – akasolace

0

編集したですか?ここで

In [50]: import pandas as pd 

In [48]: pd.set_option('precision', 2) 

In [51]: df = pd.DataFrame(data) 

In [52]: df 
Out[52]: 
    dpr_HS_corZFac dpr_NS_corZFac npol 
0    NaN    NaN NaN 
1   38.55    NaN NaN 
2   37.89   35.74 35.74 
3   40.25   36.33 36.33 
4   39.20   35.69 35.69 
5   37.23   36.58 36.58 
6   37.36   37.24 37.24 
7   40.32   38.17 38.17 
8   39.04   38.81 38.81 
9   33.01   36.76 36.76 
10   27.19   30.19 30.19 


In [56]: df.replace(np.NaN, 99.99, inplace=True) 

In [57]: print df.to_string() 
    dpr_HS_corZFac dpr_NS_corZFac npol 
0   99.99   99.99 99.99 
1   38.55   99.99 99.99 
2   37.89   35.74 35.74 
3   40.25   36.33 36.33 
4   39.20   35.69 35.69 
5   37.23   36.58 36.58 
6   37.36   37.24 37.24 
7   40.32   38.17 38.17 
8   39.04   38.81 38.81 
9   33.01   36.76 36.76 
10   27.19   30.19 30.19 

In [58]: 

(完全であることを)ファイルに書き込む

In [59]: with open(r'C:\temp\data.txt', 'w') as f: 
      f.write("Whatever you want here") 
    ...:  f.write(df.to_string(index=False)) 
    ...: 
+0

はい、私はこれを試しました。しかし、私のバージョンにあるヘッダーをどのように追加すればよいですか?たとえば、Charanjitはこのテキストファイルを書いています.... –

+0

回答編集: – Kelvin

+0

これはうまくいくようです。それらのインデックスを削除するか、別のものに置き換える方法はありますか? –

関連する問題