2010-05-29 21 views
2

我在處理某個項目的某些csv數據文件時遇到了問題。有人建議使用python/csv閱讀器來幫助分解這些文件,我已經取得了一些成功,但不是我可以使用的方式。使用精確的格式化參數用python寫入csv文件

此代碼與我之前嘗試的代碼有點不同。我基本上試圖創建一個數組。在原始數據格式中,前7行不包含任何數據,然後每列包含50個實驗,每個實驗有4000行,總計爲200000行。我想要做的就是取每一列,並將其製作爲一個單獨的csv文件,每個實驗都在其自己的列中。因此,對於每種數據類型,它將是一個50列4000行的數組。這裏的代碼確實打破了正確的值,我認爲邏輯沒問題,但它正在打破我想要的方式。我想不帶引號的分隔符(逗號和空格),我希望引號中的元素值。現在它的做法恰恰相反,沒有引號的元素值和引號中的分隔符。我花了幾個小時試圖找出如何做到這一點無濟於事,

import csv 

ifile = open('00_follow_maverick.csv') 
epistemicfile = open('00_follower_maverick_EP.csv', 'w') 

reader = csv.reader(ifile) 

colnum = 0 
rownum = 0 
y = 0 
z = 8 
for column in reader: 
    rownum = 4000 * y + z 
    for element in column: 
     writer = csv.writer(epistemicfile) 
     if y <= 50: 
      y = y + 1 
      writer.writerow([element]) 
      writer.writerow(',') 
      rownum = x * y + z 
     if y > 50: 
      y = 0 
      z = z + 1 
      writer.writerow(' ') 
      rownum = x * y + z 
     if z >= 4008: 
      break 

這是怎麼回事:我現在每行中的4000次迭代的原始數據文件,這樣我可以分開他們用逗號進行了50次實驗。當y,這裏的實驗指標達到50時,它重新回到實驗0,並且通過4000 * y + z的公式將1加到z,它告訴它要查看哪一行。完成所有50個實驗的行後,結束。這裏的問題是,我不知道如何讓python寫入引號中的實際值,以及我的分隔符是否在引號外。

任何幫助將不勝感激。如果這似乎是一個愚蠢的問題,我沒有編程經驗,這是我的第一次嘗試。謝謝。

對不起,我會盡量讓這個更清楚。原始的csv文件有幾列,每列都是不同的數據集。

原始文件的一個縮影例子如下:

column1    column2   column3 
exp1data1time1  exp1data2time1  exp1data3time1 
exp1data1time2  exp1data2time2  exp1data3time2 
exp2data1time1  exp2data2time1  exp2data3time1 
exp2data1time2  exp2data2time2  exp2data3time2 
exp3data1time1  exp3data2time1  exp3data3time1 
exp3data1time2  exp3data2time2  exp3data3time2 

所以,實際的版本有4000行,而不是2對每個新的實驗。實際版本中有40列,但基本上,原始文件中的數據類型與列號相匹配。我想將每個數據類型或列分隔成一個單獨的csv文件。

這看起來像:

csv file1 

exp1data1time1 exp2data1time1 exp3data1time1 
exp1data1time2 exp2data1time2 exp3data1time2 

csv file2 

exp1data2time1 exp2data2time1 exp3data2time1 
exp1data2time2 exp2data2time2 exp3data2time2 

csv file3 

exp1data3time1 exp2data3time1 exp3data3time1 
exp1data3time2 exp2data3time2 exp3data3time2 

所以,我會在文件中移動的原始數據到一個新的列,並且每個數據類型以它自己的文件。現在我只做一個文件,直到我可以移動單獨的實驗來分隔新文件中的列。所以,在代碼中,上面會讓4000變成2.我希望這樣做更有意義,但如果沒有,我會再試一次。

+0

我認爲,我們有以下這個麻煩。顯示輸入和所需的輸出。 – 2010-05-29 03:57:59

+0

我建議我們教哈里森先生「釣魚」,或者給他提供有關「如何釣魚」的信息,而不是「給他一條魚」。此代碼不是他的主要問題。 – msw 2010-05-29 04:37:03

回答

2

如果我相依爲命,我看到在這種狀態下生物或迷幻或化學數據庫的時間爲貓:

「每一列包含50個實驗, 每4000行,爲200000一些 行總。我想要做的是每列 ,並使其成爲個人 csv文件,每個實驗在其 自己的列。因此,這將是 50列和4000行的數組,每個數據 類型」

我有太多farking許多貓。

我甚至沒有看你的代碼,因爲重新修復你提出的問題只是另一個需要解決的問題,我並不認爲你是錯的,你聲稱自己是一個新手,所有的同事都會犯同樣的錯誤。開始的程序員還沒有明白如何去做使用陣列通常會以變量聲明結束:

integer response01, response02, response03, response04, ... 

然後非常冗餘的代碼,當他們試圖查看是否每個響應都是 - 比如說1.我認爲這是生物信息學中的一個誘人的錯誤,因爲它實際上模擬了它們來自的紙質符號。不幸的是,紙張模型並不是建模數據的最佳方式。

您應該閱讀並理解爲什麼database normalization開發,編碼並主導人們如何思考結構化數據。一篇維基百科文章可能不夠。使用我摘錄的例子讓我試着解釋我是怎麼想的。您的數據包含觀察數據;換句話說,原始數據是一個單獨的觀察。然而,這種觀察有一個背景:它是4000個觀測值中的一個,每個觀測值屬於50個實驗之一。如果你有一個上下文附加到每個觀察你會風與尋址方案,看起來像:

<experiment_number, observation_number, value> 

在數據庫術語來說,這是一個元組,它是能夠代表的,毫不含糊和完善對稱你的數據的全部。我不能肯定,我已經明白你的數據的確切結構,所以也許是更多的東西一樣:

<experiment_number, protocol_number, observation_number, value> 

,其中協議可以是某種形式的可變治療Ⅱ型 - 讓我們說的pH值。但請注意,我沒有將該協議稱爲pH值,我也沒有將其記錄在數據庫中。我需要的是一個輔助表格,其中顯示了協議的相關參數,例如

<protocol_number, acidity, temperature, pressure> 

現在我們剛剛建立了一個「關係」,這些數據庫的人喜歡談論;我們也開始正常化數據。如果您需要了解給定方案的pH值,那麼在協議表的相應行中只有一個地方可以找到它。請注意,我已經將在數據表上以及觀察表上很好匹配的數據分開,我無法看到特定數據的pH值。但沒關係,因爲如果需要的話,我可以在協議表中查找它。這是一個「關係連接」,如果需要的話,我可以合併來自所有不同表格的所有參數,並重構原始數據表的原始非結構化榮耀。

我希望這個答案對您有些用處。我確定我甚至不知道您的數據來自哪個研究領域,但這些原則適用於從藥物試驗到採購申請處理的各個領域。請理解,根據您的要求,我試圖通知您,並且沒有意願。我歡迎就此事提出進一步的問題。

+0

好的,不幸的是,我不知道如何將上下文信息附加到數據。這些原則可能適用,我想我明白你在這方面得到了什麼。從長遠來看,我可以看出爲什麼這會有所幫助,但我一直以我描述的方式處理東西。如果不是代碼,我很好奇這個問題是什麼?它確實適用於我們正在做的事情,即使不是最好的方式。該部門是哲學。實驗數據分析在我的部門中是非常有爭議的,通常不是經過批准的方法,因此也沒有教授。我會密切關注這一點。謝謝。 – 2010-05-29 05:23:09

+0

對於證明這個陳述錯誤的答案+1:「這是一個問題和答案網站,不是一個'複雜的問題,讓你成爲一個人網站的有見地的答案。'人們應該能夠用簡單的答案提出簡單的問題,而這些問題可能恰恰是用勺子餵食的。很多人只是想編寫可行的代碼,而沒有被授權。「 -Owen(http://meta.stackexchange.com/questions/8724/how-to-deal-with-google-questions/8728#8728) – bernie 2010-05-29 06:05:34

+0

@亞當:感謝你的客氣話,我不確定是否我應該說「哎呀」是違反meta的。)@Ben:感謝澄清,我必須說「實驗認識論」對我來說是一個新的想法(顯然是對哲學而言)。在對這個主題進行了一些閱讀之後,它確實將社會學或人類學方法應用於哲學問題。作爲一個相對較新的試圖建立自己的子域,在我看來,你應該使用上個世紀開發的最好的分析實踐,而不是混淆最常見的新手錯誤。 – msw 2010-05-29 13:42:45

0

正常化的數據集

感謝您給的例子。你有我已經描述的背景,也許我可以更清楚地說明。

column1    column2   column3 
exp1data1time1  exp1data2time1  exp1data3time1 
exp1data1time2  exp1data2time2  exp1data3time2 

這些柱子是由最後一個人製作的技巧;也就是說,他們沒有相關的信息。當解析成一個正常的形式,您的數據看起來就像是我的第一個建議的元組:

<experiment_number, time, response_number, response> 

,我懷疑time實際上可能意味着「subject_id」或「trial_number」。將所有不同的response值連接到相同的數據集中可能看起來很不協調;的確基於你期望的輸出,我懷疑它確實如此。乍一看,反對意見「,但主體對椅子認識屬性問題的回答與他們關於顏色的元認知信念無關,但這是錯誤的。這些數據是相關的,因爲它們有一個共同的實驗主題,自相關是社會學分析中的一個重要概念。

例如,您可能會發現受訪者A給出的答覆與被訪者B相同,但由於主體如何理解標準,A的所有答案都有偏差。這會使數據的絕對值產生很大的差異,但我希望你能看到「做A和B實際上有不同的認知模型?」這個問題。是顯着的和有效的。數據建模的一種方法可以很容易地回答這個問題,你所期望的方法不會。

解析代碼很快就會出現。

0

歸一碼

#!/usr/bin/python 

"""parses a csv file containing a particular data layout and normalizes 

    The raw data set is a csv file of the form:: 

     column1    column2    column3 
     exp01data01time01  exp01data02time01  exp01data03time01 
     exp01data01time02  exp01data02time02  exp01data03time02 

    where there are 40 such columns and the literal column title 
    is added as context to the output row 

    it is assumed that the columns are comma separated but 
    the lexical form of the subcolumns is unspecified. 

    Output will consist of a single CSV output stream 
    on stdout of the form:: 

     exp01, time01, data01, column1 

    for varying actual values of each field. 
""" 

import csv 
import sys 

def split_subfields(s): 
    """returns a list of subfields of s 
     this function is expected to be re-written to match the actual, 
     unspecified lexical structure of s.""" 
    return [s[0:5], s[5:11], s[11:17]] 


def normalise_data(reader, writer): 
    """returns a list of the column headings from the reader""" 

    # obtain the headings for use in normalization 
    names = reader.next() 

    # get the data rows, split them out by column, add the column name 
    for row in reader: 
     for column, datum in enumerate(row): 
      fields = split_subfields(datum) 
      fields.append(names[column]) 
      writer.writerow(fields) 

def main(): 
    if len(sys.argv) != 2: 
     print >> sys.stderr, ('usage: %s input.csv' % sys.argv[0]) 
     sys.exit(1) 

    in_file = sys.argv[1] 

    reader = csv.reader(open(in_file)) 
    writer = csv.writer(sys.stdout) 
    normalise_data(reader, writer) 

if __name__ == '__main__': main() 

使得命令python epistem.py raw_data.csv > cooked_data.csv產量摘錄輸出看起來像:

exp01,data01,time01,column1 
... 
exp01,data40,time01,column40 
exp01,data01,time02,column1 
exp01,data01,time03,column1 
... 
exp02,data40,time15,column40 
+0

謝謝。我會看看數據安排。我這個領導這件事的教授並不在意,他更願意看到最終的圖表等等。還有第二位(社會學)教授,他曾經有過一些參與和關閉的工作,所以我會由他來管理它。如果他分析數據,看看他會如何想要這些數據。 exp實際上是關於知識獲取,而不是處理/信仰,所以價值觀在不同的時間。查看實現的時間量。最後,問題的核心。我們正試圖用實際數據建立知識獲取的計算機模型。 – 2010-05-29 21:24:24

+0

所以,這組數據僅來自計算機模型,認知模型已經在其中專門解釋了。好的,謝謝,今天 – 2010-05-29 21:36:58