Szukaj…


Uwagi

dtypy nie są rodzime dla pand. Są wynikiem pand zbliżonych architektonicznie do numpy.

typ kolumny nie musi w żaden sposób korelować z pythonowym typem obiektu zawartego w kolumnie.

Tutaj mamy pd.Series z pływakami. Dtype będzie float .

Następnie używamy astype do „rzutowania” go w celu sprzeciwiania się.

pd.Series([1.,2.,3.,4.,5.]).astype(object)
0    1
1    2
2    3
3    4
4    5
dtype: object

Dtype jest teraz obiektem, ale obiekty na liście nadal są zmiennoprzecinkowe. Logiczne, jeśli wiesz, że w Pythonie wszystko jest obiektem i można go upcastować do obiektu.

type(pd.Series([1.,2.,3.,4.,5.]).astype(object)[0])
float

Tutaj próbujemy „rzutować” zmiennoprzecinkowe na łańcuchy.

pd.Series([1.,2.,3.,4.,5.]).astype(str)
0    1.0
1    2.0
2    3.0
3    4.0
4    5.0
dtype: object

Dtype jest teraz obiektem, ale typ pozycji na liście to ciąg. Wynika to z faktu, że numpy nie numpy ciągów znaków, a zatem działa tak, jakby były tylko obiektami i nie numpy dla nich żadnego problemu.

type(pd.Series([1.,2.,3.,4.,5.]).astype(str)[0])
str

Nie ufaj dtypom, są one artefaktem architektonicznej wady pand. Określ je tak, jak musisz, ale nie polegaj na tym, jaki typ dtype jest ustawiony na kolumnie.

Sprawdzanie typów kolumn

Typy kolumn można sprawdzić za pomocą .dtypes atrybutu DataFrames.

In [1]: df = pd.DataFrame({'A': [1, 2, 3], 'B': [1.0, 2.0, 3.0], 'C': [True, False, True]})

In [2]: df
Out[2]:
   A    B      C
0  1  1.0   True
1  2  2.0  False
2  3  3.0   True

In [3]: df.dtypes
Out[3]:
A      int64
B    float64
C       bool
dtype: object

W przypadku pojedynczej serii można użyć atrybutu .dtype .

In [4]: df['A'].dtype
Out[4]: dtype('int64')

Zmieniające się typy

astype() zmienia astype() serii i zwraca nową serię.

In [1]: df = pd.DataFrame({'A': [1, 2, 3], 'B': [1.0, 2.0, 3.0], 
                           'C': ['1.1.2010', '2.1.2011', '3.1.2011'], 
                           'D': ['1 days', '2 days', '3 days'],
                           'E': ['1', '2', '3']})
In [2]: df
Out[2]:
   A    B          C       D  E
0  1  1.0   1.1.2010  1 days  1
1  2  2.0   2.1.2011  2 days  2
2  3  3.0   3.1.2011  3 days  3

In [3]: df.dtypes
Out[3]:
A      int64
B    float64
C     object
D     object
E     object
dtype: object

Zmień typ kolumny A na zmiennoprzecinkową i typ kolumny B na liczbę całkowitą:

In [4]: df['A'].astype('float')
Out[4]:
0    1.0
1    2.0
2    3.0
Name: A, dtype: float64

In [5]: df['B'].astype('int')
Out[5]:
0    1
1    2
2    3
Name: B, dtype: int32

astype() służy do konwersji określonego typu (tzn. możesz określić .astype(float64') , .astype(float32) lub .astype(float16) ). Do ogólnej konwersji możesz użyć pd.to_numeric , pd.to_datetime i pd.to_timedelta .

Zmiana typu na numeryczny

pd.to_numeric zmienia wartości na typ liczbowy.

In [6]: pd.to_numeric(df['E'])
Out[6]:
0    1
1    2
2    3
Name: E, dtype: int64

Domyślnie pd.to_numeric błąd, jeśli danych wejściowych nie można przekonwertować na liczbę. Możesz zmienić to zachowanie, używając parametru errors .

# Ignore the error, return the original input if it cannot be converted
In [7]: pd.to_numeric(pd.Series(['1', '2', 'a']), errors='ignore')
Out[7]:
0    1
1    2
2    a
dtype: object

# Return NaN when the input cannot be converted to a number
In [8]: pd.to_numeric(pd.Series(['1', '2', 'a']), errors='coerce')
Out[8]:
0    1.0
1    2.0
2    NaN
dtype: float64

W razie potrzeby sprawdź, czy wszystkich wierszy z isnull wejściowymi nie można przekonwertować na wartości liczbowe, użyj boolean indexing z wartością isnull :

In [9]: df = pd.DataFrame({'A': [1, 'x', 'z'],
                           'B': [1.0, 2.0, 3.0],
                           'C': [True, False, True]})

In [10]: pd.to_numeric(df.A, errors='coerce').isnull()
Out[10]: 
0    False
1     True
2     True
Name: A, dtype: bool

In [11]: df[pd.to_numeric(df.A, errors='coerce').isnull()]
Out[11]: 
   A    B      C
1  x  2.0  False
2  z  3.0   True

Zmiana typu na datetime

In [12]: pd.to_datetime(df['C'])
Out[12]:
0   2010-01-01
1   2011-02-01
2   2011-03-01
Name: C, dtype: datetime64[ns]

Pamiętaj, że 2.1.2011 jest konwertowany na 1 lutego 2011 r. Jeśli zamiast tego chcesz 2 stycznia 2011 r., Musisz użyć parametru dayfirst .

In [13]: pd.to_datetime('2.1.2011', dayfirst=True)
Out[13]: Timestamp('2011-01-02 00:00:00')

Zmiana typu na timedelta

In [14]: pd.to_timedelta(df['D'])
Out[14]:
0   1 days
1   2 days
2   3 days
Name: D, dtype: timedelta64[ns]

Wybieranie kolumn na podstawie typu

Metoda select_dtypes może być używana do wybierania kolumn na podstawie typu dtype.

In [1]: df = pd.DataFrame({'A': [1, 2, 3], 'B': [1.0, 2.0, 3.0], 'C': ['a', 'b', 'c'], 
                           'D': [True, False, True]})

In [2]: df
Out[2]: 
   A    B  C      D
0  1  1.0  a   True
1  2  2.0  b  False
2  3  3.0  c   True

Za pomocą parametrów include i exclude możesz określić, które typy chcesz:

# Select numbers
In [3]: df.select_dtypes(include=['number'])  # You need to use a list
Out[3]:
   A    B
0  1  1.0
1  2  2.0
2  3  3.0    

# Select numbers and booleans
In [4]: df.select_dtypes(include=['number', 'bool'])
Out[4]:
   A    B      D
0  1  1.0   True
1  2  2.0  False
2  3  3.0   True

# Select numbers and booleans but exclude int64
In [5]: df.select_dtypes(include=['number', 'bool'], exclude=['int64'])
Out[5]:
     B      D
0  1.0   True
1  2.0  False
2  3.0   True

Podsumowanie rodzajów

get_dtype_counts metody get_dtype_counts aby zobaczyć rozkład dtypów.

In [1]: df = pd.DataFrame({'A': [1, 2, 3], 'B': [1.0, 2.0, 3.0], 'C': ['a', 'b', 'c'], 
                           'D': [True, False, True]})

In [2]: df.get_dtype_counts()
Out[2]: 
bool       1
float64    1
int64      1
object     1
dtype: int64


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow