阅读每个整个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代码的解释器,所以如果有错字,那么很抱歉…