我正在使用此处列出的数据集: https://archive.ics.uci.edu/ml/datasets/Balance+Scale
我正在尝试创建一个通用函数,以便能够按照这两个规则解析任何分类数据:
必须有一个标有class的列,其中包含对象的类
每行必须具有相同数量的列
我正在使用的数据的最小示例:
Class,LW,LD,RW,RD
B,1,1,1,1
L,1,2,1,1
R,1,2,1,3
R,2,2,4,5
这提供了3个唯一的类:B,L,R。它还提供了4个与每个条目相关的特性:LW,LD,RW和RD。
以下是我处理一般案例的函数的一部分,但我的问题是我不知道如何检查是否有任何列标签丢失:
import pandas as pd
import sys
dataframe = pd.read_csv('Balance_Data.csv')
columns = list(dataframe.columns.values)
if "Class" not in columns:
sys.exit("'Class' is not a column in the data")
if "Class.1" in columns:
sys.exit("Cannot specify more than one 'Class' column")
columns.remove("Class")
inputX = dataframe.loc[:, columns].as_matrix()
inputY = dataframe.loc[:, ['Class']].as_matrix()
此时,正确的值为:
inputX = array([[1, 1, 1, 1],
[1, 2, 1, 1],
[1, 2, 1, 3],
[2, 2, 4, 5]])
inputY = array([['B'],
['L'],
['R'],
['R'],
['R'],
['R']], dtype=object)
但如果我删除最后一列标签(RD)并重新处理,
Class,LW,LD,RW
B,1,1,1,1
L,1,2,1,1
R,1,2,1,3
R,2,2,4,5
我明白了:
inputX = array([[1, 1, 1],
[2, 1, 1],
[2, 1, 3],
[2, 4, 5]])
inputY = array([[1],
[1],
[1],
[2]])
这表示它从右到左而不是从左到右读取标签值,这意味着如果任何数据输入到没有正确数量标签的此功能中,它将无法正常工作。 / p>
如何检查行的维度是否与列数相同? (可以假设数据本身没有间隙,列之外的每行数据总是具有相同数量的元素)
答案 0 :(得分:1)
我会把它拉出来如下:
In [11]: df = pd.read_csv('Balance_Data.csv', index_col=0)
In [12]: df
Out[12]:
LW LD RW RD
Class
B 1 1 1 1
L 1 2 1 1
R 1 2 1 3
R 2 2 4 5
断言检查可以是:
if "Class" in df.columns:
sys.exit("class must be the first and only the column and number of columns must match all rows")
然后检查最后一列中没有NaN:
In [21]: df.iloc[:, -1].notnull().all()
Out[21]: True
注意:发生这种情况,例如以下(坏)csv:
In [31]: !cat bad.csv
A,B,C
1,2
3,4
In [32]: df = pd.read_csv('bad.csv', index_col=0)
In [33]: df
Out[33]:
B C
A
1 2 NaN
3 4 NaN
In [34]: df.iloc[:, -1].notnull().all()
Out[34]: False
我认为这是唯一两个失败的案例(但我认为错误信息可以更清楚)......