Pandas将字符串转换为整数

64

我有一个包含ID号码的大型数据框:

ID.head()
Out[64]: 
0    4806105017087
1    4806105017087
2    4806105017087
3    4901295030089
4    4901295030089

目前这些都是字符串。

我想在不使用循环的情况下将其转换为int - 为此我使用ID.astype(int)

问题是我的一些行包含无法转换为int的脏数据,例如:

ID[154382]
Out[58]: 'CN414149'

我该如何(无需使用循环)删除这些类型的出现,以便我可以安心使用 astype

2个回答

113
你需要向函数to_numeric添加参数errors='coerce'
ID = pd.to_numeric(ID, errors='coerce')

如果ID是列:
df.ID = pd.to_numeric(df.ID, errors='coerce')

但非数字会被转换为NaN,所以所有值都是float类型。

对于int需要先将NaN转换为某个值,例如0,然后再进行强制类型转换为int

df.ID = pd.to_numeric(df.ID, errors='coerce').fillna(0).astype(np.int64)

示例:

df = pd.DataFrame({'ID':['4806105017087','4806105017087','CN414149']})
print (df)
              ID
0  4806105017087
1  4806105017087
2       CN414149

print (pd.to_numeric(df.ID, errors='coerce'))
0    4.806105e+12
1    4.806105e+12
2             NaN
Name: ID, dtype: float64

df.ID = pd.to_numeric(df.ID, errors='coerce').fillna(0).astype(np.int64)
print (df)
              ID
0  4806105017087
1  4806105017087
2              0

编辑:如果使用 pandas 0.25+ 版本,则可以使用integer_na

df.ID = pd.to_numeric(df.ID, errors='coerce').astype('Int64')
print (df)
              ID
0  4806105017087
1  4806105017087
2            NaN

5
  1. 如果您在这里是因为您遇到了以下错误
OverflowError: Python int too large to convert to C long

使用.astype('int64')转换为64位带符号整数:

df['ID'] = df['ID'].astype('int64')

如果您不想失去带有字母的值,可以使用带有正则表达式模式的 str.replace() 函数来移除非数字字符。
df['ID'] = df['ID'].str.replace('[^0-9]', '', regex=True).astype('int64')

然后输入

0    4806105017087
1    4806105017087
2         CN414149
Name: ID, dtype: object

转换为
0    4806105017087
1    4806105017087
2           414149
Name: ID, dtype: int64

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接