【问题标题】:Python Pandas Convert String to int/floatPython Pandas 将字符串转换为 int/float
【发布时间】:2018-09-10 14:55:26
【问题描述】:

我有一个我试图操作的 pandas 数据框,以便将“数量”列从字符串(“hh.hh 'hours'”)转换为 int 或 float。

我想知道在这种情况下最佳做法是什么。我试过 pd.to_numeric(),但没有成功。我认为我的问题在于每个字符串末尾的“小时”。

是否有另一个函数可以识别数字字符并简单地忽略字符串的“小时”部分,或者在使用内置的 dtype 转换函数 (pd.to_numeric) 之前,我是否首先需要修剪最后 5 个字符?谢谢!

           day  amount
2018-08-23  3   24.00 hours
2018-08-24  4   8.00 hours
2018-08-25  5   32.00 hours
2018-08-26  6   24.00 hours
2018-08-27  0   24.00 hours

【问题讨论】:

  • 我认为修剪'hours' 是最简单的。应该很快就能完成
  • 谢谢。我过去在处理时间序列数据时遇到过从 dateutils 导入的解析器函数(用于将某些内容转换为“2018 年 7 月 4 日上午 10:30”的曲调为 datetime() 对象)。我很想知道 pandas 中是否有类似的东西我没有偶然发现。

标签: python pandas


【解决方案1】:

只需使用字符串方法来获取重要的数字。根据列的混乱程度或格式,有很多可用选项:

import pandas as pd

df['amount'] = pd.to_numeric(df.amount.str.replace('hours', ''), downcast='integer')
# or 
df['amount'] = pd.to_numeric(df.amount.str[:-5], downcast='integer')
# or
df['amount'] = pd.to_numeric(df.amount.str.extract('(\d+\.?\d*)')[0], downcast='integer')

所有输出:

            day  amount
2018-08-23    3      24
2018-08-24    4       8
2018-08-25    5      32
2018-08-26    6      24
2018-08-27    0      24

【讨论】:

    【解决方案2】:

    根据您数据的完整性,您可以使用pd.to_timedelta 将其转换为持续时间(timeDelta):

    >>>df.amount=pd.to_timedelta(df.amount)
    >>>df
    
        date      day   amount
    0   2018-08-23  3   1 days 00:00:00
    1   2018-08-24  4   0 days 08:00:00
    2   2018-08-25  5   1 days 08:00:00
    3   2018-08-26  6   1 days 00:00:00
    4   2018-08-27  0   1 days 00:00:00
    

    【讨论】:

      猜你喜欢
      • 2014-07-25
      • 1970-01-01
      • 2013-03-04
      • 1970-01-01
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多