仅将pd.series的数字元素转换为float

时间:2020-07-02 14:38:32

标签: python pandas dataframe type-conversion

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

无论如何,我是否只能将该系列的数字元素转换为float(ex:1.30 milhões €),而其余部分保持原样?我还想将数千转换为1000,将百万转换为百万1000000。这是我真正想要的:1.30 milhões €1300000

2 个答案:

答案 0 :(得分:0)

如果我理解正确,那么您的熊猫系列带有字符串(即,您的第一个元素是字符串'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)

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

答案 1 :(得分:0)

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

因此,为了给出一个数据帧,其值是原始的,而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
相关问题