【问题标题】:How to replace string separator(,) in Numerical Columns?如何替换数字列中的字符串分隔符(,)?
【发布时间】:2019-10-24 20:33:31
【问题描述】:

我正在尝试将“数量”列转换为 int。

数量列有一个字符串(,)分隔符或数值分隔符

使用代码

data['Quantity'] = data['Quantity'].astype('int')
data['Quantity'] = data['Quantity'].astype('float')

我收到此错误:

ValueError: could not convert string to float: '16,000'

ValueError: invalid literal for int() with base 10: '16,000'

数据

Date         Quantity

2019-06-25       200
2019-03-30       100
2019-11-02       250
2018-10-23       100
2018-07-17       150
2018-05-31       150
2018-07-05       100
2018-10-04       100
2018-02-23       100
2019-09-16       204
2019-09-16       315
2019-11-09       113
2019-08-29         5
2019-08-23         4
2019-06-18        78
2019-12-06         4
2019-12-06         2
2019-10-03    16,000
2019-07-03     8,000
2018-12-12        32

Name: Quantity, dtype: object

这是一个有 124964 行的 pandas 数据框。我添加了数据的头部和尾部

我可以做些什么来解决这个问题?

【问题讨论】:

  • 这是熊猫数据框吗?另外,你的数据中不应该有16,000吗?
  • 抱歉马上关闭,我的名声太大了。我想知道stackoverflow.com/questions/1779288/… 是否会解决您的问题,但它不涉及 Pandas 数据框。但是locale 的使用可能是关键。因为在荷兰,16,000 意味着 16,但在美国,它意味着 16000。
  • 这是一个有 124964 行的 pandas 数据框。我添加了数据的头部和尾部
  • 您从什么创建数据框? csv?

标签: python pandas dataframe lambda replace


【解决方案1】:

解决方案

# Replace string "," with ""

data["Quantity"] = data["Quantity"].apply(lambda x: str(x.replace(',','')))

data['Quantity'] = data['Quantity'].astype('float')

【讨论】:

    【解决方案2】:

    '16,000' 既不是 int 也不是 float 的有效表示,实际上格式是不明确的 - 根据语言环境标准,它可能意味着 16.0 (float) 或 16000 (int)。

    您首先需要指定应如何解释此数据,然后修复字符串,使其成为浮点数或整数的有效表示,然后使用正确的类型应用 asType()

    要使'16,000' 成为有效的浮点表示,您只需将逗号替换为点:

    val = '16,000'
    val = val.replace(",", ".")
    

    要使其成为 int(值为 16000),您只需删除逗号:

    val = '16,000'
    val = val.replace(",", "")
    

    我不使用 panda,所以我不知道如何使用数据框最好地做到这一点,但这肯定是有记录的。

    作为一般规则:处理来自外部世界的数据(您自己的代码之外的任何内容)时,切勿信任数据,始终确保在使用前对其进行验证和清理。

    【讨论】:

    • 应该解释为16000
    • 不知何故我做到了。谢谢你的想法@bruno
    【解决方案3】:
    number = '16,000'
    act_num = ''
    for char in number:
        try:
            character = int(char)
            act_num+=(char)
        except:
            if char == '-' or char == '.':
                act_num+= (char)
    print(float(act_num))
    

    【讨论】:

    • 但这将 16,000, -16000, 16.000 都视为相同
    • @RemcoGerlich 我已经编辑了答案。尝试了你所有的例子,它的工作原理
    • @Krishna 有用吗?我没有包含循环数据框的部分,但我相信你可以做到这一点
    • @Sid 我无法遍历整个数据框。也许我不知道该怎么做。请仔细阅读更新后的问题,让我知道如何解决它
    • @Krishna 抱歉,但我不知道如何在 pandas 中工作
    【解决方案4】:

    data.Quantity = data.Quantity.astype(str).astype(int)

    【讨论】:

    • 还有小数点,你必须使用float 而不是int
    • 所以用float代替int
    • @ShashwatHirapure 欢迎来到 SO 并感谢您提供帮助。不幸的是,你的答案是错误的(数据已经是一个字符串并且这个字符串不能变成一个整数),并且不符合 SO 标准以获得一个好的答案(一个好的答案不仅应该提供一个可行的解决方案,还应该解释解决方案)。
    猜你喜欢
    • 2013-02-08
    • 2021-03-11
    • 2015-01-13
    • 2010-10-19
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 2021-07-11
    • 1970-01-01
    相关资源
    最近更新 更多