导入CSV文件并附加到数组

时间:2016-03-07 16:29:32

标签: python arrays csv numpy

我有一个格式如下的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

我想导入此文件,并且对于文件中的每一行,将点lat和lon附加到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])

任何人都可以建议为什么这不起作用,甚至更好地建议一个更好的方法来实现同样的事情。谢谢!

3 个答案:

答案 0 :(得分:2)

首先,您通常希望使用with open(filename, 'r') as ...:格式。其中一个原因是,如果遇到错误,文件将自动关闭。

通常使用csv.reader来读取Python中的csv文件(尽管如果使用Pandas,也可以使用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)

答案 1 :(得分:1)

所以,基本上你想要来自csv文件的lat和long数据,是吗?我建议你使用pandas' read_csv(),这样就不需要逐行循环文件了。 Pandas可以同时处理所有列。

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]])

答案 2 :(得分: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。然后用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]]