2017-07-12 11 views
0

私はPythonにはかなり新しく、データを整理する必要があります。私は、ライブラリ、モジュール、実装のためのより良いコード、またはちょうど方向性について、これに関するベストプラクティスに関する助言をしたい。データをPythonで変換する:文字列を行に変換する

A:100 B:200 C:300 

A:150 B:350 C:370 

すなわち:

は、だから私は、次の形式で編成されたデータのテキストファイルを持っています各行は関連データ、A/B/Cという3つの変数を表します。新しい行には同じ変数に関するデータが表示されますが、別のオブジェクトに関連しています。

だから私のデータはテキストファイルであり、私は次の形式で出力することにしたい:

100 '\t' 150 

200 '\t' 350 

300 '\t' 370 

すなわち、変数A、B、Cのデータの行を集計し、Graphing Toolkit(おそらくOrigin Pro)にエクスポートすることができます。

これは私がこれまでに作ってみたコードです:

with open("example.txt", 'r') as file: 
    for line in file.readlines(): 
     line = line.replace(' ', '\n') 
     line = line.split(':', 1)[-1] 
     print line 

これは以下にデータを変換:

100 
B:200 
C:300 

150 
B:350 
C:370 

.splitとして()のみで行っ明らかです.replace()を使用してデータ間に改行を追加する前に、各行を削除します。私は.replace()を使用した後も、.split()を実行するために、または[2:]を繰り返し実行する必要があるので、先行する変数名を削除する必要があります。私はどのように列を作成するために各行のデータを表にするつもりですか?

アイデア?ありがとう!

+0

あなたFOR-でインデントループが正しくありません。質問を編集してください。このコードはSyntaxErrorを引き起こします。 –

+0

'str.replace'と' str.split'は文字列を変更しません。あなたは、これを意味するために出力を割り当てる必要があります。例えば'line = line.replace( ''、 '\ n')' –

+0

これらすべてを修正し、コードをより構文的に正しいものにするために編集しました。ありがとう! – tyrfingnir

答えて

0

明らかに、変数の値を保持するためのデータ構造が必要です。最も適切なものは、リストの辞書です:

d = {'A': [], 'B': [], 'C': []} 

その後、あなたは「名前:値」内にそれぞれの行を分割し、ファイルを経る:符号にこれらの項目を分割し、appriopriately値を格納する、その後、アイテム:

with open("example.txt", 'r') as file: 
    for line in file: 
     elements = line.rstrip().split() 
     for e in elements: 
      (name, value) = e.split(':') 
      d[name].append(value) 

、最終的にあなたがあなたの出力データを、行ごとに一つの変数:私はpandasライブラリを使用することをお勧め

for k in sorted(d): 
    print('\t'.join(d[k])) 
0

あなたのようないくつかの追加の引数を持つデータフレームにファイルをロードするために read_csv機能を使用することができます import pandasます後
import pandas as pd 

df = pd.read_csv(path_to_infile, sep=' ', header=None, names=['A', 'B', 'C']) 
df = df.applymap(lambda x: int(x[2:])) 
df.to_csv(path_to_outfile, sep='\t', header=False, index=False) 

:示すために使用することができ、セパレータ

  • headerを宣言するために使用され

    • sep列名を持たないこと
    • names列に名前を割り当てるのに使用されます。

    その後、データフレーム全体でapplymap関数を使用して、変数名とコロンを削除できます。

    最後にto_csvメソッドを使用して、headerを付けずにファイルを保存することができますが、今回はindexがなくても、デフォルトでインデックス列が追加されるためです。

    引き続き、新しいセパレータを宣言するには、sep引数を使用できます。

  • 0

    あなたはそれが本当に簡単にそれを作るpandasを使用して行うことができます:

    import pandas as pd 
    
    df = pd.read_csv(file_path,sep=' ',header=None,names = ['A','B','C']) 
    output = df.apply(lambda x:x[.str.replace('^([A-Z]:)','')],axis=1).T 
    output.to_csv(file_path,sep='\t',header = False, index = False) 
    

    ドキュメント:

    pandas.apply

    pandas.read_csv

    pandas.to_csv

    関連する問題