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