检测Pandas中缺少的列标签

时间:2017-05-10 00:42:17

标签: python pandas

我正在使用此处列出的数据集: https://archive.ics.uci.edu/ml/datasets/Balance+Scale

我正在尝试创建一个通用函数,以便能够按照这两个规则解析任何分类数据:

  1. 必须有一个标有class的列,其中包含对象的类

  2. 每行必须具有相同数量的列

  3. 我正在使用的数据的最小示例:

    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>

    如何检查行的维度是否与列数相同? (可以假设数据本身没有间隙,列之外的每行数据总是具有相同数量的元素)

1 个答案:

答案 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

我认为这是唯一两个失败的案例(但我认为错误信息可以更清楚)......