Python 使用函数时将浮点转换为int不起作用
我需要在数据帧中加入一列。该列包含混合数据类型,例如:Python 使用函数时将浮点转换为int不起作用,python,string,type-conversion,Python,String,Type Conversion,我需要在数据帧中加入一列。该列包含混合数据类型,例如: s = pd.Series([3985500,'3985500',3985500.0,'3985500.0','3985500A','3985500B']) 我试图将所有数字转换为int,以确保在加入时找到键。不管是字符串还是字符串,只要将浮点值转换为int,就可以保留字符串,并且允许最后的列格式为字符串 我尝试了astype(),但它忽略了浮点数,出于某种原因,我一直在使用科学符号(参见索引2和索引3): 我得到pd.to_numeri
s = pd.Series([3985500,'3985500',3985500.0,'3985500.0','3985500A','3985500B'])
我试图将所有数字转换为int,以确保在加入时找到键。不管是字符串还是字符串,只要将浮点值转换为int,就可以保留字符串,并且允许最后的列格式为字符串
我尝试了astype()
,但它忽略了浮点数,出于某种原因,我一直在使用科学符号(参见索引2和索引3):
我得到pd.to_numeric
使用try except处理浮点:
try: int(pd.to_numeric(s[3]))
except ValueError: s[3]
3985500
dtype: int
但是,只要我在函数中尝试它,它就不会返回任何结果:
def convert_to_int(cell):
try: int(pd.to_numeric(cell))
except ValueError: cell
convert_to_int(s[3])
知道为什么会这样吗?可能还有其他的解决方法,但为什么它在函数中不起作用呢
我希望将此函数用于s.apply()
。我看过两篇类似的帖子:
您没有从函数返回任何值,即
def convert_to_int(cell):
try:
return int(pd.to_numeric(cell))
except ValueError:
cell
convert_to_int(s[3])
要使用apply()语法,请执行以下操作:
您需要将所有数字类型值转换为int
。您不需要有单独的函数,您可以简单地使用,如下所示:
In [202]: s = pd.Series([3985500,'3985500',3985500.0,'3985500.0','3985500A','3985500B'])
In [203]: s = s.apply(lambda x:x if isinstance(x, str) else int(x))
In [204]: s
Out[204]:
0 3985500
1 3985500
2 3985500
3 3985500.0
4 3985500A
5 3985500B
dtype: object
上述命令将所有数字类型转换为int
,保持string
不变。返回int(pd.to_numeric(cell))
。此外,您还可以将downcast
参数作为“整数”传递给传递给\u numeric
,避免使用int
进行强制转换。您是否在笔记本中运行此操作?否则,您的徒劳尝试也不会产生输出。谢谢@lightalchest,返回的正是您所缺少的。见公认的答案。但是,由于某些原因,使用向下播放选项仍然会将索引2处的值作为浮点值返回。@Mistermiagi,是的,我正在笔记本中运行此选项,这就是为什么它会在裸try except
中显示结果的原因。谢谢!这是一个新手犯的错误。我假设返回是隐含的,因为当它没有函数时,它在Google Colab中显示一个没有返回的值。但这是有道理的,因为它还不是一个函数。我认为这是正确的答案,因为它回答了为什么它不能作为函数工作的问题。@MayankPorwal给出的答案似乎更有效。顺便说一句,如果我没有弄错的话,除外
也需要一个返回值?谢谢,但是这个方法仍然以浮点形式返回索引3处的数字。但它似乎更有效。它在索引3处返回一个浮点,因为它在初始化s
时被定义为一个字符串。我明白你的意思。这就是为什么我使用了try except
,首先尝试并转换为int。您如何为索引3处的字符串做准备?
s.apply(lambda x:convert_to_int(x))
In [202]: s = pd.Series([3985500,'3985500',3985500.0,'3985500.0','3985500A','3985500B'])
In [203]: s = s.apply(lambda x:x if isinstance(x, str) else int(x))
In [204]: s
Out[204]:
0 3985500
1 3985500
2 3985500
3 3985500.0
4 3985500A
5 3985500B
dtype: object