Python表格分类

-1 投票
1 回答
600 浏览
提问于 2025-04-16 14:28

我有一个文本文件(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]

撰写回答