Python表格分类
我有一个文本文件(test.data),里面包含了一些数值和类别名称,比如说:
4.5,3.5,U1
4.5,10.5,U2
4.5,6,U1
3.5,10.5,U2
3.5,10.5,U2
5,7,U1
7,6.5,U1
我需要把这些数据整理成行(矩阵),其中第1行、第2行等是数据,最后一行是类别。所以我开始写了这个代码:
reader = csv.reader(open('test.data', 'r'))
result = []
for row in reader:
result.append(row)
print result
输出结果:
[['4.5', '3.5', 'U1'], ['4.5', '10.5', 'U2'], ['4.5', '6', 'U1'], ['3.5', '10.5', 'U2'], ['3.5', '10.5', 'U2'], ['5', '7', 'U1'], ['7', '6.5', 'U1']]
这一切都运行得不错,但现在我需要从这些数据中制作一个矩阵分类。在这种情况下,我想制作一个矩阵:
test data=[data1, data2,.....,class name1]
test data2=[data1, data2,.....,class name2]...
我需要这个“矩阵”(测试数据, 测试数据2),因为我接下来会从每个测试数据中选择2/3的数据,这部分数据会被称为“选择的”,剩下的1/3数据必须保留在测试数据中,……
所以我需要的输出是:
choosen=[data,data,......class name1] # 2/3 from every **test.data**
test data=[data1, data2,.....,class name1] # other 1/3 from test data
test data2=[data1, data2,.....,class name1] # other 1/3 from test data 2
.
. . . .
.
非常感谢你的帮助
编辑2:
如果我使用你的代码,我得到的是:
{
'U1': [
['4.5','3.5'],
['4.5','6'],
['5','7'],
['7','6.5']
],
'U2': [
['4.5','10.5'],
['3.5','10.5'],
['3.5','10.5']
]
}
但我并不是每次都有这些数据:
4.5,3.5,U1
4.5,10.5,U2
4.5,6,U1
3.5,10.5,U2
3.5,10.5,U2
5,7,U1
7,6.5,U1
我还有:
4.5,3.5,4.5,10.5, U1
3.5,10.5,3.5,10.5,U2
4.5,12.5,3.5,12.5,U2
...... (所以我不知道类别在第二行,就像你在代码中写的那样),但我知道最后一行是类别
那么我该如何修改你的代码:
reader = csv.reader(open('test.data', 'r'))
result = {}
for row in reader:
uclass=row[2] #-------> must be last row not second !!!!
if result.has_key(uclass):
result[uclass].append([row[0],row[1]]) #---->not just 2 row's, on other data I have for example 5 rows..
else:
result[uclass]=[[row[0],row[1]]] #---->not just 2 row's, on other data I have for example 5 rows..
print repr(result)
1 个回答
1
编辑: 原始代码片段已修改,以处理N列输入(最后一列是类别)。这个要求是在提问者后来的回复中提到的。
reader = csv.reader(open('test.data', 'r'))
result = {}
for row in reader:
uclass=row[-1]
if result.has_key(uclass):
result[uclass].append(row[0:-1])
else:
result[uclass]=row[0:-1]
print repr(result)
我对你问题的后半部分仍然不是很确定。 也许你解释的方式缺少了一些东西。
如果我理解正确的话,你是想为每个类别准备一个不同的列表吗?
如果是这样的话,使用字典应该可以满足你的需求:
reader = csv.reader(open('test.data', 'r'))
result = {}
for row in reader:
uclass=row[2]
if result.has_key(uclass):
result[uclass].append([row[0],row[1]])
else:
result[uclass]=[[row[0],row[1]]]
print repr(result)
结果看起来会像这样:
{
'U1': [
['4.5','3.5'],
['4.5','6'],
['5','7'],
['7','6.5']
],
'U2': [
['4.5','10.5'],
['3.5','10.5'],
['3.5','10.5']
]
}
对于跳过数据,你可以使用在较新版本的Python中提供的列表切片跳过选项:
someList[<start>:<end>:<skip>]
比如在一个列表上:
someList=[0,1,2,3,4,5,6,7,8,9]
使用跳过切片的方法,比如:
someList[0:10:2]
会得到:
[0,2,4,6,8]