2014-08-28 37 views
2

我很新的蟒蛇維字典,列表或數組從CSV文件...兩個在Python

我想從以下格式的CSV文件中讀取的迴歸係數矩陣爲蟒蛇:

0.10 0.15 0.20 0.25 0.30 0.35 
a1 -0.0011 0.0008 0.0019 0.0034 0.0067 0.0047-0.0026 
a2 0.0134 -0.3042 -0.2531 -0.2138 -1.2345 -0.2380 2.0402 
a3 0.0546 0.2708 0.1738 0.0810 0.8451 -0.0034 -1.4961 
a4 -0.0226 -0.0052 -0.0021 -0.0024 -0.0023 -0.0745 0.0563 
a5 -0.0101 0.0108 0.0153 0.0263 0.0491 0.0327 -0.0691 

我需要能夠訪問此矩陣的特定元素,例如['a1','0.10'] = - 0.0011。我認爲一個字典適合存儲這些數據,但很難使其具有二維性。

我已經設法讀取這個數據到一個字典,頂行元素作爲一個關鍵,但我不知道如何完成我想要的雙鍵。我使用的代碼如下:

import csv, sys 

reader = csv.DictReader(open(sys.path[0]+"\\DSYHScoeff_98.dat", 'r'), delimiter=' ') 

result = {} 
for row in reader: 
    for column, value in row.iteritems(): 
     result.setdefault(column, []).append(value) 

對於處理這些數據,你有什麼建議嗎?

最好的問候, 亞當

+0

您的標題行似乎太短。它只有6個標籤,而其他所有行都有1個標籤和7個值。另外,'0.0047-0.0026'確實沒有空格嗎? – 2014-08-28 11:32:00

回答

0

老實說,我會做手工。

header,data = None,dict() 
with open("filename.csv") as f: 
    for line in f: 
     if header is None: 
     header = line.split() 
     continue 
     l = line.split() 
     for i in xrange(len(l)-1): 
     data[l[0],header[i]] = l[i+1] 

作品一旦我做了調整tobias_k也在他們的評論中提到。

0

我會做什麼可能是追加成纔像「斧子」在文件的開頭:

ax 0.10 0.15 0.20 0.25 0.30 0.35 
a1 -0.0011 0.0008 0.0019 0.0034 0.0067 0.0047 -0.0026 
[...] 

然後稍微改變你的代碼:

result = {} 
for row in reader: 
    x = row.pop(reader.fieldnames[0]) 
    for column, value in row.iteritems(): 
     if column and value: 
      y = float(column) 
      result[x,y] = float(value) 

它應該工作:

>>> result['a3',0.15] 
0.2708 
3

pandas一起去,其設計用於這個東西:

>>> import pandas as pd 
>>> names = ['0.10', '0.15', '0.20', '0.25', '0.30', '0.35', '0.40'] 
>>> i = pd.read_csv('test.csv', delim_whitespace=True, names=names) 
>>> i 
    0.10 0.15 0.20 0.25 0.30 0.35 0.40 
0 -0.0011 0.0008 0.0019 0.0034 0.0067 0.0047 -0.0026 
1 0.0134 -0.3042 -0.2531 -0.2138 -1.2345 -0.2380 2.0402 
2 0.0546 0.2708 0.1738 0.0810 0.8451 -0.0034 -1.4961 
3 -0.0226 -0.0052 -0.0021 -0.0024 -0.0023 -0.0745 0.0563 
4 -0.0101 0.0108 0.0153 0.0263 0.0491 0.0327 -0.0691 
>>> i['0.10'][0] 
-0.0011000000000000001 
+0

我看了一下[documentation](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.parsers.read_csv.html)。這個功能可以使用51個不同的kwargs。這是世界紀錄還是什麼? – Vincent 2014-08-28 11:47:50

0

你必須先標籤添加到您的第一列:

# ▼▼▼ 
    row 0.10 0.15 0.20 0.25 0.30 0.35 
    a1 -0.0011 0.0008 0.0019 0.0034 0.0067 0.0047-0.0026 
    a2 0.0134 -0.3042 -0.2531 -0.2138 -1.2345 -0.2380 2.0402 
# [...] 

之後,這只是獲得在「行列」的行索引的問題。包裹在一個函數:

def cell(arr,row,col): 
    try: 
     return result[col][result['row'].index(row)] 
    except KeyError: 
     return "N/A" 

鑑於你的輸入文件 - 和你的代碼:

# 
# insert your code here 
# 

from pprint import pprint 
pprint(result) 

def cell(arr,row,col): 
    try: 
     return result[col][result['row'].index(row)] 
    except KeyError: 
     return "N/A" 

pprint(cell(result, 'a1', '0.10')) 
pprint(cell(result, 'a1', '0.14')) 

生產:

{None: [[''], [''], [''], ['']], 
'': ['', '2.0402', '-1.4961', '0.0563', '-0.0691'], 
'0.10': ['-0.0011', '0.0134', '0.0546', '-0.0226', '-0.0101'], 
'0.15': ['0.0008', '-0.3042', '0.2708', '-0.0052', '0.0108'], 
'0.20': ['0.0019', '-0.2531', '0.1738', '-0.0021', '0.0153'], 
'0.25': ['0.0034', '-0.2138', '0.0810', '-0.0024', '0.0263'], 
'0.30': ['0.0067', '-1.2345', '0.8451', '-0.0023', '0.0491'], 
'0.35': ['0.0047-0.0026', '-0.2380', '-0.0034', '-0.0745', '0.0327'], 
'row': ['a1', 'a2', 'a3', 'a4', 'a5']} 
'-0.0011' 
'N/A' 

(請注意您的輸入數據文件可能是這是非常明顯的pprint'ed字典 - 請參閱您的問題意見了解詳情)