杀鸡焉用牛刀 发表于 2023-8-9 10:28:00

【pandas小技巧】--字符串转数值

字符串转数字的用途和场景很多,其中主要包括以下几个方面:

[*]数据清洗:在进行数据处理时,经常会遇到一些数据类型不匹配的问题,比如某些列中的字符串类型被误认为是数字类型,此时需要将这些字符串类型转换为数字类型,才能进行后续的数值计算或统计分析。
[*]数据整理:有时候输入的原始数据可能存在格式问题,例如有些数值前面带有美元符号或者其他符号,这些符号会干扰后续的计算,因此需要将它们去掉并转换为数字类型。
[*]数据可视化:在进行数据可视化时,需要将含有数字信息的字符串转换成数字类型,以便于更好地展示数据、制作图表。
[*]机器学习:在机器学习领域中,经常需要将文本或其他非数字类型的特征转换为数字型特征,从而应用各种基于数值型特征的算法模型。
本篇介绍一些常用的字符串转数值的方法。
1. 一般情况

一般情况下,只需要通过 astype 函数就可以改变列的数据类型。
import pandas as pd

df = pd.DataFrame({
    "A": ,
    "B": ,
    "C":["1.2", "2.3", "3.3"],
})

df.dtypes
df.C = df.C.astype("float64")
df.dtypeshttps://cdn.nlark.com/yuque/0/2023/png/2235414/1684136960880-60a9f54c-6af3-4795-b3bd-b6d581c7bdb2.png#averageHue=%23f3ecec&clientId=ube628ebe-4b84-4&from=paste&height=154&id=u0328e8b0&originHeight=154&originWidth=433&originalType=binary&ratio=1&rotation=0&showTitle=false&size=22874&status=done&style=none&taskId=ub20fb023-2b49-4c50-a2b2-a113be38fb7&title=&width=433
上面的示例把C列有字符串类型转换成了浮点数类型。
2. 异常值情况

上面的示例中,C列中每个字符串都可以正常转换成浮点数,所以用astype函数就可以了。
不过,大部分情况下,待转换的列中会存在无法正常转换的异常值。
直接转换会报错:
df = pd.DataFrame({
    "A": ,
    "B": ,
    "C":["1.2", "2.3", "xxx"],
})

df.dtypes
df.C = df.C.astype("float64")
dfhttps://cdn.nlark.com/yuque/0/2023/png/2235414/1684137393628-7f0e744a-1af2-45cd-a15d-b3acfdb12443.png#averageHue=%23eeecec&clientId=ube628ebe-4b84-4&from=paste&height=45&id=u14e8b142&originHeight=45&originWidth=589&originalType=binary&ratio=1&rotation=0&showTitle=false&size=6801&status=done&style=none&taskId=u421d31c7-7727-4fca-9871-35645b27af7&title=&width=589
这时,可以用 to_numeric 函数,此函数的 errors 参数有3个可选值:

[*]ignore:出现错误时忽略错误,但是正常的值也不转换
[*]raise:抛出错误,和astype函数一样
[*]coerce:无法转换的值作为NaN,可转换的值正常转换
df = pd.DataFrame({
    "A": ,
    "B": ,
    "C":["1.2", "2.3", "xxx"],
})

df
df.C = pd.to_numeric(df.C, errors="coerce")
dfhttps://cdn.nlark.com/yuque/0/2023/png/2235414/1684138915826-c8402667-3b5e-476e-ba02-a66e33f6cce8.png#averageHue=%23f3f1f0&clientId=ube628ebe-4b84-4&from=paste&height=196&id=ud107cd10&originHeight=196&originWidth=444&originalType=binary&ratio=1&rotation=0&showTitle=false&size=17435&status=done&style=none&taskId=u8efe3b55-c3a7-41d6-a93b-8018ad7f071&title=&width=444
C列正常转换为float64,无法转换的值变成NaN。
如果不希望用NaN来填充异常的值,可以再用 fillna 填充自己需要的值。
df.C = pd.to_numeric(
    df.C, errors="coerce"
).fillna(0.0)
dfhttps://cdn.nlark.com/yuque/0/2023/png/2235414/1684139031696-ecf29713-9a00-43ef-83e6-b6808be29b9b.png#averageHue=%23f4f1f1&clientId=ube628ebe-4b84-4&from=paste&height=200&id=u9ed5ba23&originHeight=200&originWidth=436&originalType=binary&ratio=1&rotation=0&showTitle=false&size=17229&status=done&style=none&taskId=u9e22ed68-5447-4c86-a757-4ea131fb5e6&title=&width=436
3. 全局转换

如果需要转换成数值类型的列比较多,用上面的方法一个列一个列的转换效率不高。
可以用apply方法配合 to_numeric 一次转换所有的列。
df = pd.DataFrame({
    "A": ,
    "B": ,
    "C":["1.2", "2.3", "xxx"],
    "D":["10", "4.6", "yyy"],
})

df
df = df.apply(
    pd.to_numeric, errors="coerce"
)
dfhttps://cdn.nlark.com/yuque/0/2023/png/2235414/1684139476323-bd61e2db-2e94-46d4-ba8b-fa26e3a86ace.png#averageHue=%23f2eeee&clientId=ube628ebe-4b84-4&from=paste&height=206&id=u3849d2a3&originHeight=206&originWidth=502&originalType=binary&ratio=1&rotation=0&showTitle=false&size=23199&status=done&style=none&taskId=ubdecf31d-cf91-4c26-8323-44017fb65fc&title=&width=502
同样,apply也可以通过fillna填充缺失值NaN。
df = df.apply(
    pd.to_numeric, errors="coerce"
).fillna(0.0)
dfhttps://cdn.nlark.com/yuque/0/2023/png/2235414/1684139611322-c1cdb192-ff7b-4ba2-ab42-48464a1da731.png#averageHue=%23f1eeed&clientId=ube628ebe-4b84-4&from=paste&height=188&id=u56af208c&originHeight=188&originWidth=488&originalType=binary&ratio=1&rotation=0&showTitle=false&size=22484&status=done&style=none&taskId=uf89912c6-5da8-4712-b547-8ca3ac26b4d&title=&width=488

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 【pandas小技巧】--字符串转数值