我是新手使用python / pandas以有组织,可重复,确定的方式清理英国国家学生数据库中的数据 . 完整的数据集可以在这里找到https://www.compare-school-performance.service.gov.uk/download-data我找不到如何在这个问题上添加表格,但是 Headers 是这样的; RECTYPE,PCODE,TOTPUPS,KS2APS数据框 >>> np.asanyarray(df) 看起来像这样 .

array([[1, 'NW1 1TA', '642', '27.6'],
    [1, 'NW1 1RX', '881', '26.5'],
    [1, 'NW5 1RN', 'NEW', '29.5'],
    [1, 'BN6 8LP', '1046', 'SUPP']], dtype=object)

Rectype总是包含整数,允许我在数字上成功过滤 . 问题是总瞳孔和KS2平均先前达到(TOTPUPS,KS2APS)应该是整数和浮点数,但包含频繁的字符串 .

我用 df = df[df.KS2APS != "SUPP"] 成功地将这些过滤掉了 .

最后一步是根据TOTPUPS df = df[df.TOTPUPS > 199] 进行数字滤波 . 这与 TypeError: '>' not supported between instances of 'str' and 'int' 失败因为包含非数字数据的列是这样的,所以我使用.to_numeric

>>> pd.to_numeric(df.TOTPUPS)
... 
5552    1046
Name: TOTPUPS, Length: 3735, dtype: int64

这告诉我类型现在是int64 ...但是当我尝试以数字方式过滤时仍然失败 . this stack overflow post建议如果失败了's 40721 . To check I'已将输出写入csv文件并在Excel中打开(不太有用!)和记事本显示值都是整数或空字符串所以我也尝试删除空字符串,然后转换.to_numeric和过滤但仍然没有快乐 .

我有一个非常糟糕但非常有效的解决方法,将我的数据帧写入文件并重新读取,但我仍然想知道我哪里出错了 .

更新我的解决方案(即解决方法!)创建新列确实有效...

df['TOTPUPSint'] = pd.to_numeric(df.TOTPUPS)
df = df[df.TOTPUPSint > 199]
len(df)
3113
np.asanyarray(df)
array([[1, 'NW1 1TA', '642', '27.6', 642],
    [1, 'NW1 1RX', '881', '26.5', 881],
    [1, 'NW5 1RN', '805', '29.5', 805],
    ...,
    [1, 'RH19 3TY', '1616', '28.1', 1616],
    [1, 'RH14 9RY', '1621', '28.3', 1621],
    [1, 'BN6 8LP', '1046', '29.4', 1046]], dtype=object)

还验证了结果符合预期,但这仍然是一种解决方法,而不是正确理解问题 .

为暗示建议正确的方式为暗的满分是 df['TOTPUPS'] = pd.to_numeric(df['TOTPUPS'],errors='coerce') 我的数据帧现在看起来像

array([[1, 'NW1 1TA', 642, '27.6', 642],
    [1, 'NW1 1RX', 881, '26.5', 881],
    [1, 'NW5 1RN', 805, '29.5', 805],
    ...,
    [1, 'RH19 3TY', 1616, '28.1', 1616],
    [1, 'RH14 9RY', 1621, '28.3', 1621],
    [1, 'BN6 8LP', 1046, '29.4', 1046]], dtype=object)

第三列和第五列都没有引号 . 我是这个论坛的新手,但是如果有一些方法可以将Dark的有用答案标记为正确,请告诉我 . 谢谢 .