python - 检测 Pandas 中缺失的列标签

标签 python pandas

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

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

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

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

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

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/

相关文章:

Python-can OSError : An address incompatible with the requested protocol was used

python - 仅拆分列表中的表情符号,但保留文本

python - 高斯平滑python中的图像

postgresql - pandas read_sql 将列名转换为小写 - 有解决方法吗?

python - 使用 Scikit-learn 使用日期变量进行回归

python - 如何在 django 中使用 get_next_by_FOO() ?

python - 如何递归遍历所有子目录并读取文件?

python - 如何格式化轴 x 日期 ('dd/mm/yyyy' )?

python - 用 pandas DataFrame 制作一个字符串

python - 根据现有列中的某些规则在新数据框列中设置值