我正在使用此处概述的数据集: 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]])
这表明它从右到左而不是从左到右读取标签值,这意味着如果将任何没有正确数量标签的数据输入到此函数中,它将无法正常工作。
如何检查行数与列数是否相同? (可以假设数据本身没有间隙,列之外的每一行数据始终具有相同数量的元素)
最佳答案
我会按如下方式将其拉出:
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
我认为这是唯一的两个失败案例(但我认为错误消息可以更清楚)...
关于python - 检测 Pandas 中缺失的列标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43881891/