2017-10-11 84 views
0

我有一些CSV數據,如下圖所示。我試圖把它變成一個合理的形式,所以我可以用'A'來繪製公共x軸[1,2,3]與y軸[18,22,24]和[58,68,55]和'B'作爲傳說。Python中的CSV到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對應於A1在點1,22到A2在點2等。我試着檢查空的'單元格'並插入到當前數組中,但它變得非常混亂,而且我試圖擴展它以使它可以處理50列和20多行。

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

建議here是有益的,但我不能把它應用到我的情況。以下代碼適用於一列,但需要進一步操作並在向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的列表列表。自然,標籤的列表清單。

傳說是在第一行,所以你可以閱讀並完成它。然後讀取每兩行以提取x和標籤數據,然後再讀兩行,偏移量爲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 [列]」的元素。如果一般意義上是'x'和'y',則可以簡單地將函數的結果存儲爲'x,y,legends,labels = load_data(file)'。爲了簡潔起見,我只是嵌套了兩個函數。 – Reti43