Comment faire pour convertir une colonne avec l'objet dtype flotter dans une pandas dataframe?

0

La question

J'ai un dataframe avec une colonne nommée "hauteur" et je veux convertir les valeurs en float. L'unité par défaut est dans le compteur, mais il a certaines valeurs dans un format incorrect, ou en pouces. Il ressemble

        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

En gros, j'ai besoin de convertir les valeurs en pouces/ft au compteur, convertir des valeurs comme Bilinmiyor et Unknown pour NaN, retirez les spécifications de l'unité comme m m, remplacer la virgule dans les nombres décimaux avec .et de garder le plus grand nombre de valeur 9;6;3. La finale dtypes doit être de type float ou int.

Je suis nouveau sur python donc je ne sais pas vraiment comment utiliser les techniques avancées jusqu'à présent. Je cherche à réaliser la tâche en utilisant

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

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

mais il ne fonctionne pas. Je me demandais si je devrais utiliser itération, mais il semble très compliqué pour itérer sur toutes les cellules de cette colonne, parce que le jeu de données a plus de 2 millions de lignes.

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

La meilleure réponse

0

Je crois que vous vous mate, j'ai eu le même genre de problèmes. Mais heureusement, ce n'est pas que dur

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

Et vous obtenez

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

Maintenant, si vous voulez convertir vos pieds en mètres (je suppose que la valeur par défaut est de mètre), vous aurez besoin d'ajouter un niveau de teint

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

pour obtenir

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

espérons que cette aide

2021-11-24 06:02:07

Dans d'autres langues

Cette page est dans d'autres langues

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