标签:pandas
本文研讨将字符串转换为数字的两个pandas内置方法,以及当这两种方法单独不起作用时,如何处理一些特殊情况。
运行以下代码以创建示例数据框架。每列都包含文本/字符串,我们将使用不同的技术将它们转换为数字。我们使用列表解析创建多个字符串列表,然后将它们放入数据框架中。
代码语言:javascript复制import pandas as pd
import numpy as np
l1 = [f'10{i}'for i in range(10,30)]
l2 = [f'10{i}.{i}'for i in range(10,30)]
l3 = [f'1.0{i}.{i}'for i in range(10,30)]
l4 = [f'1,0{i}'for i in range(10, 30)]
l5 = [f'$1,0{i}'for i in range(10,30)]
l6 = [f'{i}%'for i in range(20)]
l7 = [f'{i}.{i}%'for i in range(20)]
l8 = [f'10{i}'if i%2 == 0else'asdf'for i in range(10,30)]
l9 = [f'$1,0{i}'if i%2 == 0else'asdf'for i in range(10,30)]
df = pd.DataFrame({'l1':l1,
'l2':l2,
'l3':l3,
'l4':l4,
'l5':l5,
'l6':l6,
'l7':l7,
'l8':l8,
'l9':l9,
})
使用df.head()方法查看数据框架的前5行。记住,数据框架中的所有值都是字符串数据类型。
图1
df.astype()方法
这可能是最简单的方法。我们可以获取一列字符串,然后强制数据类型为数字(即整数或浮点数)。
对于第一列,因为我们知道它应该是“整数”,所以我们可以在astype()转换方法中输入int。
图2
然而,如果数据包含小数,int将不起作用。在这种情况下,我们需要将float传递到方法参数中。
图3
这个方法看起来很容易应用,但这几乎是它所能做的——它不适用于其余的列。原因是其他列都包含某种特殊字符,如逗号(,)、美元符号($)、百分比(%)等。显然,.astype()方法无法处理这些特殊字符。
pd.to_numeric()方法
此方法的工作方式与df.astype()类似,但df.astype()无法识别特殊字符,例如货币符号($)或千位分隔符(点或逗号)。
然而,这种方法在某些需要清理数据的情况下非常方便。例如,列l8中的数据是“文本”数字(如“1010”)和其他实文本(如“asdf”)的混合。在pd.to_numeric方法中,当errors=’coerce’时,代码将运行而不引发错误,但对于无效数字将返回NaN。
然后我们可以用其他伪值(如0)替换这些NaN。
图4
图5
包含特殊字符的数据
对于包含特殊字符(如美元符号、百分号、点或逗号)的列,我们需要在将文本转换为数字之前先删除这些字符。
我们可以使用df.str访问整个字符串列,然后使用.str.replace()方法替换特殊字符。例如:
df[‘l3’] = df[‘l3’].str.replace(‘.’,‘’, n=1)
上面的n=1参数意味着我们只替换“.”的第一个匹配项(从字符串开始)。默认情况下,n设置为-1,这将替换所有引用。
不要将.str.replace()与df.replace()混淆。前者只对字符串进行操作,而后者可以处理字符串或数字。
最后,清理其他列:
代码语言:javascript复制df['l4']= df['l4'].str.replace(',', '')
df['l5']= df['l5'].str.replace(',', '').str.replace('$', '')
df['l6']= df['l6'].str.replace('%', '')
df['l9']= df['l9'].str.replace('$', '').str.replace(',', '')
删除所有特殊字符后,现在可以使用df.astype()或pd.to_numeric()将文本转换为数字。