2016-03-07 61 views
1

我有一個被格式化爲csv文件如下:導入CSV文件,並追加到一個數組

Image Id,URL,Latitude,Longitude 
17609472165,https://farm8.staticflickr.com/7780/17609472165_c44d9b5a0e_q.jpg,48.843226,2.31805 
11375512374,https://farm6.staticflickr.com/5494/11375512374_66a4d9af6c_q.jpg,48.844166,2.376 
24768920940,https://farm2.staticflickr.com/1571/24768920940_634cc06f43_q.jpg,48.844619,2.395897 
9411072065,https://farm8.staticflickr.com/7368/9411072065_5e2083a32e_q.jpg,48.844666,2.3725 
9996916356,https://farm3.staticflickr.com/2807/9996916356_640c493020_q.jpg,48.844666,2.3725 
24281266199,https://farm2.staticflickr.com/1623/24281266199_bf63e25c23_q.jpg,48.844925,2.389616 

我要導入此文件,並在文件中的每一行追加一個點緯度和經度的2D陣列。我試圖代碼如下所示,它不工作(或打印任何東西),並給出錯誤「ValueError異常:所有輸入數組維度除了串列軸線必須完全匹配」

import numpy 

data = open('dataset_import_noaddress', 'r') 
A = [] 

for line in data: 
    fields = line.strip().split(',') 
    lat = fields[2] 
    lon = fields[3] 
    print lat 
    print lon 
    newrow = [lat, lon] 
    A = numpy.vstack([A, newrow]) 

任何人都可以說明爲什麼這不起作用,或者甚至更好提出一個更好的方法來實現同樣的事情。謝謝!

回答

1

你想剛剛看了你的CSV與各行的緯度,經度的矩陣。所以基本上看,它的刪除第2列

代碼

import numpy as np 

input = np.genfromtxt(open("dataset.csv","rb"),delimiter=",", skip_header=1) 
A = np.delete(input, [0,1], 1) 

print(A) 

它只是讀取CSV所有非浮點值轉換爲NaN。然後,只需刪除第一個2列與np.delete

輸出

[[ 48.843226 2.31805 ] 
[ 48.844166 2.376 ] 
[ 48.844619 2.395897] 
[ 48.844666 2.3725 ] 
[ 48.844666 2.3725 ] 
[ 48.844925 2.389616]] 
+1

'genfromtxt'接受'usecols'參數;'usecols = [2,3]''你不需要刪除任何東西。 – hpaulj

2

首先,您通常要使用with open(filename, 'r') as ...:格式。其中一個原因是,如果遇到錯誤,文件將自動關閉。

人們經常使用csv.reader來閱讀Python中的csv文件(雖然如果您使用的是熊貓,您也可以使用pd.read_csv(...)來閱讀表格)。然後您需要使用for line in reader:遍歷閱讀器。

您正在獲取單個變量並創建中間列表,每行使用numpy.vstack。將所有內容聚合爲一個列表然後在整個列表中調用vstack會更有效率。

A.append(line[2:4])從給定行的列表中獲取第三個和第四個項目(例如[48.843226,2.31805])並將其附加到較大的列表A.您應該首先確保該行在添加之前至少有四個值,保留跟蹤壞線。

一旦A被構建,您就可以調用vstack。

import csv 

with open(filename, 'r') as f: 
    A = [] 
    bad_lines = [] 
    reader = csv.reader(f) 
    for line in reader: 
     if len(line) == 4: 
      A.append(line[2:4]) 
     else: 
      bad_lines.append(line) 
    A = np.vstack(A) 
+0

你所回答OP的問題...如果你給了一些解釋相關,它可能是一個不錯的答案值得一給予好評。目前,它只是一個代碼,我很想下決心:-( –

1

所以,基本上你想從csv文件經緯度數據,是嗎?我建議你使用pandas'read_csv(),這樣就不需要逐行循環文件了。熊貓可以一次處理所有列。

import pandas as pd 

file_ = pd.read_csv("dataset_import_noaddress", sep = ',') 
A = np.array(file_[["Latitude", "Longitude"]]) 
print A 

array([[ 48.843226, 2.31805 ], [ 48.844166, 2.376 ], [ 48.844619, 2.395897], [ 48.844666, 2.3725 ], [ 48.844666, 2.3725 ], [ 48.844925, 2.389616]])