2017-10-11 10 views
0

私はCSVにいくつかのデータを表示しています。私はそれを賢明な形にしようとしているので、y軸[18,22,24]と[58,68,55]に対して共通のx軸[1、2、3]を 'A'そして伝説としての「B」。Pythonの2D/3DリストにぎこちないCSVを追加

私の現在の考えは、x軸の繰り返しが得られますが、次の構造が最も簡単なことです。

[['A',[1,'A1',18],[2,'A2',22],[3,'A3',24]], 
['B',[1,'B4',58],[2,'B4',68],[3,'B6',55]]] 

ここは醜いデータです。あなたはおそらく言うことができるように、AとBはヘッダーです。 18はポイント1のA1に、ポイント2の22はA2に対応しています。空の 'セル'をチェックして現在の配列に挿入しようとしましたが、非常に乱雑ですが、これを拡張しようとしています50以上の列と20以上の行に対処できます。

,A,B 
1,A1,B4 
,18,58 
2,A2,B5 
,22,68 
3,A3,B6 
,24,55 

アドバイスhereは役に立ちましたが、私の状況には適用できませんでした。以下のコードは1つのカラムで機能しましたが、さらに操作が必要で、CSVファイルにカラムを追加した後は壊れました。

import csv 

arr = [] 

datafile = open('datafile1.csv', 'r', newline='') 
reader = csv.reader(datafile) 
for row in reader: 
    if row[0] != "": 
     #print(row) 
     arr.append(row) 
    elif row[1] != "": 
     arr[-1].insert(len(arr),row[1]) 

datafile.close() 

ご協力いただけると助かります。

+0

元のデータを編集することをお勧めします。現在、行はラベルとデータの間で交互に表示されます。実際のデータポイントは6つしかありません。インデックス(1、2、3)とヘッダー( "A"、 "B")があります。 –

+0

あなたの返事をありがとう。残念ながら私はフォーマットに悩まされています。それはイライラしています。それを一覧にラインごとにダンプし、そこから操作する方が良いでしょうか?現在のアプローチでは、非常に遅くて面倒なExcel VBAを使用しています。 – PythonicRitual

答えて

0

データをプロットする場合は、xのリストとyのリストが最適な形式です。当然、ラベルのリストです。

凡例は最初の行に表示されていますので、それを読んで終了してください。次に、2行ごとに読み取ってxとラベルのデータを抽出し、2つの行すべてをオフセット1で再度読み取って、すべてのyデータを読み取ります。いくつかzip()とアンパックマジックとあなたは完了です。

import csv 

import matplotlib.pyplot as plt 

def load_data(file): 
    reader = csv.reader(open(file, 'r', newline='')) 
    lines = tuple(reader) 

    legends = lines[0][1:] 
    x, *labels = zip(*lines[1::2]) 
    _, *y = zip(*lines[2::2]) 
    # must convert the data from strings to integers 
    # if floats are allowed in the data, use `float` instead 
    x = tuple(map(int, x)) 
    y = tuple(tuple(map(int, column)) for column in y) 

    return x, y, legends, labels 

def plot_columns(x, y, legends, labels): 
    for k in range(len(y)): 
     plt.plot(x, y[k]) 
     for xi, yi, ilabel in zip(x, y[k], labels[k]): 
      plt.annotate(ilabel, xy=(xi, yi), textcoords='data') 
    plt.legend(legends) 
    plt.show() 

plot_columns(*load_data('datafiel1.csv')) 

Python 2を使用している場合は、x, *labels = zip(*lines[1::2])のアンパックは許可されません。代わりに、ステップでそれを実行してください。

# for x and labels 
temp = zip(*lines[1::2]) 
x, labels = temp[0], temp[1:] 
# for y 
y = zip(*lines[2::2])[1:] 
+0

それは本当にうまくいく、ありがとう!スクリプトの中で関数の外からxiとyiのリストにアクセスするにはどうすればいいですか?私は値についていくつかのデータ分析をしたいと思います。再度、感謝します。 :) – PythonicRitual

+0

@PythonicRitual 'xi'と' yi'が一時的に存在するので、同様のループを再度実行することができます。それらは 'x'と' y [column] 'の要素にすぎません。一般的に 'x'と' y'を意味するなら 'x、y、legends、labels = load_data(file)'のように関数の結果を格納するだけです。私はちょっと簡潔にするために2つの関数を入れ子にしました。 – Reti43

関連する問題