【问题标题】:Convert only the numeric elements of pd.series to float仅将 pd.series 的数字元素转换为浮点数
【发布时间】:2020-07-02 14:38:32
【问题描述】:
nome
Douglas Friedrich         custo zero
Ernando                   custo zero
Lucas Fonseca             custo zero
Éverson                           NA
Juninho Capixaba        desconhecido
Zeca                    desconhecido
Nino Paraíba              custo zero
Douglas Borel                     NA
Elton                     custo zero
Ronaldo                   custo zero
Jádson                  desconhecido
Rodriguinho               custo zero
Marco Antônio              120 mil €
Clayson                    880 mil €
Rossi                     custo zero
Gilberto                  custo zero
Saldanha                          NA
Anderson                          NA
Juninho               1.30 milhões €
Wanderson                  400 mil €
Ignácio                 desconhecido
Giovanni                  custo zero
João Pedro              desconhecido
Matheus Silva             custo zero
Gregore                    235 mil €
Flávio                  desconhecido
Yuri                      custo zero
Saldanha                          NA
Danielzinho               custo zero
Alesson                 desconhecido
Élber                      130 mil €
Gustavo                           NA
Fernandão             1.06 milhões €
Name: preco_pago, dtype: object

无论如何,我是否可以仅将本系列的数字元素转换为浮点数(例如:1.30 milhões €)并将其余部分保持原样?我也想将数千转换为 1000,将数百万转换为数百万 1000000。这就是我真正想要的:1.30 milhões €1300000

【问题讨论】:

    标签: python pandas dataframe type-conversion


    【解决方案1】:

    您可以进行非常复杂的过滤,但无论如何,pandas 列中的 dtype 是一致的。我建议根据内容进行过滤,并应用临时转换。

    所以,为了给一个数据框,其 value 是原始的,num 是浮点数,例如:

    import pandas as pd
    import numpy as np
    
    data = """\
    Douglas Friedrich         custo zero
    Ernando                   custo zero
    Lucas Fonseca             custo zero
    Éverson                           NA
    Juninho Capixaba        desconhecido
    Zeca                    desconhecido
    Nino Paraíba              custo zero
    Douglas Borel                     NA
    Elton                     custo zero
    Ronaldo                   custo zero
    Jádson                  desconhecido
    Rodriguinho               custo zero
    Marco Antônio              120 mil €
    Clayson                    880 mil €
    Rossi                     custo zero
    Gilberto                  custo zero
    Saldanha                          NA
    Anderson                          NA
    Juninho               1.30 milhões €
    Wanderson                  400 mil €
    Ignácio                 desconhecido
    Giovanni                  custo zero
    João Pedro              desconhecido
    Matheus Silva             custo zero
    Gregore                    235 mil €
    Flávio                  desconhecido
    Yuri                      custo zero
    Saldanha                          NA
    Danielzinho               custo zero
    Alesson                 desconhecido
    Élber                      130 mil €
    Gustavo                           NA
    Fernandão             1.06 milhões €"""
    
    data = pd.Series(
        data.split('\n')
    ).str.replace(
        '  +', '|'
    ).str.rsplit(
        '|', expand=True
    ).rename(
        columns=dict(zip(range(2), ['who', 'value']))
    )
    
    f = data.value.str.contains('milhões €')
    data.loc[f, 'num'] = data.loc[f, 'value'].str.split(' ', 1).str[0].apply(float) * 1000000
    f = data.value.str.contains('mil €')
    data.loc[f, 'num'] = data.loc[f, 'value'].str.split(' ', 1).str[0].apply(float) * 1000
    

    【讨论】:

      【解决方案2】:

      如果我理解正确,您有一个带有字符串的 pandas 系列(即您的第一个元素是字符串 'Douglas Friedrich custo zero'

      您必须创建自己的函数来解析每个字符串,例如:

      def convert_to_number(s): 
          n = s.split('  ').strip()  # work with the right-hand portion only 
          if 'milhões' in n: 
              return 1e6 * float(n.split()[0]) 
          if 'mil' in n: 
              return 1e3 * float(n.split()[0]) 
          if 'zero' in n: 
              return 0 
          return np.nan
      

      然后简单地将这个函数应用到你的熊猫系列中:

      new_series = series.apply(convert_to_number)
      

      当然,您可能需要根据需要修改函数,或使其适应可能出现的任何极端情况。

      【讨论】:

      • 对不起,但是在系列上使用 apply 会调用没有“数值优化”的“普通”python(apply 更像是一个不太简单的循环),所以它可能真的很慢
      • 100% 同意,但由于 OP 没有提到任何性能要求,我发现使用 apply 对初学者更友好。
      • 感谢您的回复。当然可以,但是如果我们有一个简单的解决方案,为什么不养成好习惯呢?我认为我有一个矢量化解决方案(参见我的帖子)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 2018-11-30
      • 2021-11-25
      • 2011-11-25
      • 1970-01-01
      • 2014-09-25
      • 2010-09-05
      相关资源
      最近更新 更多