Cómo convertir una columna con objeto de dtype flotar en un pandas dataframe?

0

Pregunta

Tengo un dataframe con una columna llamada 'altura', y yo quiero convertir los valores en el flotador. La unidad predeterminada es en metro, pero tiene algunos valores en un formato incorrecto, o en pulgadas. Parece

        height
0          16
1           7
2           7
3         6 m
4        2.40
5        5'8"
6          3m
7         6,9
8       9;6;3
9     Unknown
10       4.66
11 Bilinmiyor
12     11' 4"

dtype: object

Básicamente, necesito convertir los valores en pulgadas/pies a metros de la unidad, convertir los valores como Bilinmiyor y Unknown a NaN, quitar la especificación de la unidad como m m, reemplazar la coma en los decimales de los números con .y mantener el mayor número de valor 9;6;3. El final dtypes debe ser flotante o de int.

Soy nuevo en python, así que no sabemos realmente cómo utilizar técnicas avanzadas hasta la fecha. Yo estaba tratando de lograr la tarea mediante

def to_num(a):
    try:
        return float(pd.to_numeric(a, errors = 'raise'))
    except ValueError:
        return a

df['height'] = to_num(df['height'])

pero no funcionó. Me preguntaba si debería utilizar la iteración, pero parece muy complicado para recorrer todas las celdas de esta columna, ya que el conjunto de datos tiene más de 2 millones de filas.

pandas python
2021-11-24 04:44:20
1

Mejor respuesta

0

Siento que te mate, yo tenía el mismo tipo de problemas. Pero por suerte esto no es tan difícil

import pandas as pd

df = pd.DataFrame({'height': [16, 7, '6m', '2.4', '3,5', 'Asdf', '9;6;3']})
df['height'] = df['height'].astype(str)  # force type str
df['height'] = df['height'].str.replace('.', ',', regex=False)  # . -> ,
df['height'] = df['height'].str.replace('[A-Za-z]', '')  # remove all characters (regex)
df['height'] = df['height'].str.split(';').apply(max)  # pick largest value from 9;6;3
df['height'] = pd.to_numeric(df['height'], errors='coerce')  # force float

Y usted consigue

height
0   16.0
1   7.0
2   6.0
3   2.4
4   3.5
5   NaN
6   9.0

Ahora bien, si desea convertir de pies a metros (estoy asumiendo por defecto es el metro), tendrás que añadir un nivel de cutis

import pandas as pd
import numpy as np
import re

def feet_to_m(s):
    if '\'' in s or "\"" in s:
        if '\'' in s:
            feet = float(s.split('\'')[0])
        else:
            feet = 0
        if '\"' in s:
            if '\'' in s:
                inch = float(s.split('\'')[1].split('\"')[0])
            else:
                inch = float(s.split('\"')[0])
        else:
            inch = 0
        return (feet*12 + inch) * 0.0254
    else:
        return s

df = pd.DataFrame({'height': [16, 7, '6m', '2.4', '3,5', 'Asdf', '9;6;3', "11' 4\"", "4'", "15\""]})
df['height'] = df['height'].astype(str)  # force type str
df['height'] = df['height'].str.replace(',', '.', regex=False)  # . -> ,
df['height'] = df['height'].str.replace('[A-Za-z]', '')  # remove all characters
df['height'] = df['height'].str.split(';').apply(max)  # pick largest value from 9;6;3
df['height'] = df['height'].apply(feet_to_m)
df['height'] = pd.to_numeric(df['height'], errors='coerce')  # force float

para obtener

height
0   16.0000
1   7.0000
2   6.0000
3   2.4000
4   3.5000
5   NaN
6   9.0000
7   3.4544
8   1.2192
9   0.3810

espero que esto ayude

2021-11-24 06:02:07

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................