【问题标题】:Converting floats to int not working when using a function使用函数时将浮点数转换为 int 不起作用
【发布时间】:2020-09-02 07:52:51
【问题描述】:

我在需要加入的数据框中有一列。该列包含混合数据类型,例如:

s = pd.Series([3985500,'3985500',3985500.0,'3985500.0','3985500A','3985500B'])

我正在尝试将所有数字转换为 int 以确保在加入时找到密钥。任何字符串都可以保留字符串,并且最终的列格式允许为字符串,只要将浮点数转换为int即可。

我尝试过astype(),但它忽略了浮点数,并且由于某种原因我不断获得科学记数法(参见索引 2 和 3):

s.astype(int, errors='ignore')

0       3985500
1       3985500
2    3.9855e+06
3     3985500.0
4      3985500A
5      3985500B
dtype: object

我让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() 一起使用。我看过几个类似的帖子:

【问题讨论】:

  • return int(pd.to_numeric(cell))。此外,您可以将downcast 参数作为“整数”传递给to_numeric,避免使用int 进行转换。
  • 你在笔记本上运行这个吗?否则,您的裸 try-except 也不应该产生输出。
  • 感谢@lightalchemist,返回的正是所缺少的。请参阅已接受的答案。但是,出于某种原因,使用 downcast 选项仍将索引 2 处的值作为浮点数返回。
  • @MisterMiyagi,是的,我在笔记本中运行它,这就是为什么它在裸露的try-except 中显示结果。

标签: python string type-conversion


【解决方案1】:

你没有从你的函数返回任何值,即

def convert_to_int(cell):
  try: 
      return int(pd.to_numeric(cell))
  except ValueError: 
      cell

convert_to_int(s[3])

并使用 apply() 语法:

s.apply(lambda x:convert_to_int(x))

【讨论】:

  • 谢谢!这是一个菜鸟的错误。我假设返回是隐含的,因为它在没有函数的情况下在 Google Colab 中显示一个没有返回的值。但这是有道理的,因为它还不是一个函数。我接受了这个作为正确答案,因为它回答了为什么它不能作为一个函数工作的问题。 @MayankPorwal 的回答似乎更有效率。
  • 顺便说一句,如果我没记错的话,except 也需要退货?
【解决方案2】:

您需要将所有数字类型值转换为int。你不需要单独的函数,你可以简单地使用Series.apply,像这样:

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不变。

【讨论】:

  • 谢谢,但此方法仍将索引 3 处的数字作为浮点数返回。不过看起来效率更高。
  • 它在索引 3 处返回一个浮点数,因为我们在初始化 s 时将其定义为字符串。
  • 我明白你的意思。这就是为什么我选择try-except,首先尝试转换为int。您将如何为索引 3 处的字符串做准备?
猜你喜欢
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
相关资源
最近更新 更多