阅读每个整个CSV文件的列使用Python(最好借助pandas)

我有一些在Microsoft Excel中的数据,我把它们保存为CSV文件,以方便使用。 数据结构是这样的:

MS Excel格式:

L1 0 1 0 0 0 1 1 0 0 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 

CSV格式

 L1,,,,,,,,,,,,,, 0,1,0,0,0,1,1, 0,0,1,0,0,1,0, 0,0,0,1,0,0,1, 0,0,0,0,1,0,0, 1,1,1,1,1,1,1, 1,1,1,1,1,1,1, 1,1,1,1,1,1,1, 1,1,1,1,1,1,1, 

正如你所看到的只有第一列有标签,现在我想读取CSV文件(或更容易的Excel文件)来获取每列,并对其进行一些操作操作。 我怎么能实现这个? 我已经读了一些有关pandas的东西,但我找不到任何有用的东西,以获取每个coloumn

给定.csv文件temp.csv

 L1x,,,,,,, 0,1,0,0,0,1,1, 0,0,1,0,0,1,0, 0,0,0,1,0,0,1, 0,0,0,0,1,0,0, 1,1,1,1,1,1,1, 1,1,1,1,1,1,1, 1,1,1,1,1,1,1, 1,1,1,1,1,1,1, 

阅读如下:

 import pandas a = pandas.read_csv('temp.csv', names = ["c%d" % i for i in range(8)], skiprows = 1) a 

输出:

  c0 c1 c2 c3 c4 c5 c6 c7 0 0 1 0 0 0 1 1 NaN 1 0 0 1 0 0 1 0 NaN 2 0 0 0 1 0 0 1 NaN 3 0 0 0 0 1 0 0 NaN 4 1 1 1 1 1 1 1 NaN 5 1 1 1 1 1 1 1 NaN 6 1 1 1 1 1 1 1 NaN 7 1 1 1 1 1 1 1 NaN 

最后一列中的NaN来自令人讨厌的尾随逗号。 范围内的8需要匹配列数。 访问使用中的列

 a.c3 

要么

 a[c3] 

这两者都导致

 0 0 1 0 2 1 3 0 4 1 5 1 6 1 7 1 Name: c3 

关于pandas的一个很酷的事情是,如果你想异或两列,你可以很简单。

 a.c0^a.c2 

产量

 0 0 1 1 2 0 3 0 4 0 5 0 6 0 7 0 Name: c0 

假设我有:

在这里输入图像说明

您可以将其保存到CSV文件中,如下所示:

 L1,,, L2,0,10,20 L3,1,11,21 L4,2,12,22 L5,3,13,23 L6,4,14,24 L7,5,15,25 L8,6,16,26 L9,7,17,27 L10,8,18,28 

要得到任何col,使用CSV阅读器和转置与zip:

 import csv with open('test.csv', 'rU') as fin: reader=csv.reader(fin) data=list(reader) print 'data:', data # data: [['L1', '', '', ''], ['L2', '0', '10', '20'], ['L3', '1', '11', '21'], ['L4', '2', '12', '22'], ['L5', '3', '13', '23'], ['L6', '4', '14', '24'], ['L7', '5', '15', '25'], ['L8', '6', '16', '26'], ['L9', '7', '17', '27'], ['L10', '8', '18', '28']] 

注意数据是行列表。 您可以使用zip转置列表列表以获取列表列表:

 trans=zip(*data) print 'trans:',trans # trans: [('L1', 'L2', 'L3', 'L4', 'L5', 'L6', 'L7', 'L8', 'L9', 'L10'), ('', '0', '1', '2', '3', '4', '5', '6', '7', '8'), ('', '10', '11', '12', '13', '14', '15', '16', '17', '18'), ('', '20', '21', '22', '23', '24', '25', '26', '27', '28')] 

然后只是索引来获得一个特定的列:

 print trans[0] # ('L1', 'L2', 'L3', 'L4', 'L5', 'L6', 'L7', 'L8', 'L9', 'L10') 

当然,如果你想对单元格进行算术运算,则需要将string转换为整数或浮点数。

 import pandas as pd pd.read_excel("foo.xls", "Sheet 1", names=["c%d" % i for i in range(7)]) 

输出:

  c0 c1 c2 c3 c4 c5 c6 0 0 1 0 0 0 1 1 1 0 0 1 0 0 1 0 2 0 0 0 1 0 0 1 3 0 0 0 0 1 0 0 4 1 1 1 1 1 1 1 5 1 1 1 1 1 1 1 6 1 1 1 1 1 1 1 7 1 1 1 1 1 1 1 

示例代码返回列作为数组:

 input = """L1,,,,,,,,,,,,,, 0,1,0,0,0,1,1, 0,0,1,0,0,1,0, 0,0,0,1,0,0,1, 0,0,0,0,1,0,0, 1,1,1,1,1,1,1, 1,1,1,1,1,1,1, 1,1,1,1,1,1,1, 1,1,1,1,1,1,1, """ def getColumn(data,column_number): dump_array=[] lines=data.split("\n") for line in lines: tmp_cell = line.split(",") dump_array.append(tmp_cell[3]) return dump_array #for ex. get column 3 getColumn(3,input) 

这可能会给你一个想法来制作你的网格…

注意:我现在没有用于testing代码的解释器,所以如果有错字,那么很抱歉…