提问者:小点点

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


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.30milhóese),而将其余元素保持不变? 我也想把几千转换成1000,把几百万转换成几百万,1000000。 这就是我实际想要的:1.30milhóese1300000


共2个答案

匿名用户

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

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

匿名用户

您可以使用相当复杂的过滤,但无论如何,pandas列中的dtype是一致的。 我建议根据内容进行过滤,并应用自组织转换。

因此,为了给出一个值为原始值而数为浮点值的数据帧,例如:

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