Jak przekonwertować kolumnę z typem obiektu dtype w pływające w ramce danych pandas?

0

Pytanie

Mam ramkę danych z kolumną o nazwie "wysokość" i chcę przekształcić wartość w wartość zmiennoprzecinkowa. Jednostka domyślna określona w metrach, ale niektóre wartości podane są w złym formacie lub w calach. To wygląda tak

        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

W zasadzie, muszę konwertować wartości w calach/stopach w jednostkę miary, przekształcać takie wartości, jak Bilinmiyor i Unknown Dla NaNusuń specyfikację urządzenia, np. m mwymień przecinka w liczbach dziesiętnych na .i zapisz największą liczbę wartości 9;6;3. Końcowymi typ dtypes powinny być float lub int.

Jestem początkujący w pythonie, więc na razie nie wiem, jak korzystać z zaawansowanych technik. Starałem się wykonać zadanie za pomocą

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

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

ale to nie zadziałało. Zastanawiałem się, czy należy użyć iteracji, ale wydaje się bardzo trudne wykonać iteracji dla wszystkich komórek w tej kolumnie, bo zestaw danych zawiera ponad 2 milionów wierszy.

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

Najlepsza odpowiedź

0

Czuję, że ty, kolego, u mnie były takie same problemy. Ale, na szczęście, nie jest to takie trudne

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

I masz

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

Teraz, jeśli chcesz przekształcić swoje stopy na metry (zakładam, że domyślnie jest to metr), trzeba będzie dodać poziom koloru twarzy

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

zobacz

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

mam nadzieję, że to pomoże

2021-11-24 06:02:07

W innych językach

Ta strona jest w innych językach

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