Python Pandas将列类型转换为数字

时间:2018-12-09 14:41:08

标签: python pandas dataframe

我刚开始使用python / pandas以有组织,可重复,确定性的方式从英国国家学生数据库中清除数据。完整的数据集可在此处https://www.compare-school-performance.service.gov.uk/download-data 我找不到如何为这个问题添加表格,但是带有标题。数据帧>>> np.asanyarray(df)的RECTYPE,PCODE,TOTPUPS,KS2APS看起来像这样。

    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建议如果失败,则是“因为您有不可转换的对象”。为了检查我已经将输出写入一个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的有用答案标记为正确,请告诉我。谢谢。

0 个答案:

没有答案