【问题标题】:Pandas Dataframe: Split mixed float-string column into separate float and string columnsPandas Dataframe:将混合浮点字符串列拆分为单独的浮点和字符串列
【发布时间】:2019-02-02 11:27:01
【问题描述】:

我有一个名为“VALUE”的 Pandas 数据框列,其中包含如下字符串数据:“-1.459NS” 我想创建 2 个新列 -> 'VALUE' 必须有一个浮点数 -1.459 并且 UNIT 必须有一个字符串 'NS'

是否有正则表达式和/或非正则表达式的方式来执行此操作? 最快的方法是什么?我可能有一百万多行我想这样做。

>>> d = {'VALUE': ['-1.234NS','0.22MH']}
>>> df=pd.DataFrame(data=d)
>>> df
      VALUE
0  -1.234NS
1    0.22MH

我想要:

    VALUE    UNIT
0  -1.234    NS
1    0.22    MH

VALUE 是浮点数,UNIT 是字符串

【问题讨论】:

  • 单位是否总是 2 个字符长?
  • 单位可以是任意数量的字符

标签: python regex string pandas


【解决方案1】:

df.column.str.extract 将生成一个数据框,正则表达式中每个匹配组有一列,由 int 位置索引。然后您可以使用rename 重命名列。

>>> df.VALUE.str.extract(r'([-]?[\d.]*)([\w\D]*)').rename(columns={0:'VALUE', 1:'UNIT'})

    VALUE UNIT
0  -1.234   NS
1    0.22   MH

【讨论】:

  • 我的方法是df.VALUE.str.extract('([+-.0-9]+)(.*)'),然后允许加号,并且 UNIT 也可以有数字 - 但是,我不是正则表达式专家,但至少对于上面的示例,它也会工作。
【解决方案2】:

如果以下单位不是固定长度,这是另一种解决此问题的非正则表达式方法。这会将字符串拆分为浮点数和字符串类型单元。

s = '-1.234NS'
a,b = map(str, s.split("."))
a = a + '.'
unit = ''
for num in b:
    try:
        float(num)
        a += num
    except ValueError:
        unit += num
fl = float(a)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-29
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多