pandas
Typy danych
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