Sök…
Anmärkningar
dtyp är inte infödda till pandor. De är ett resultat av pandor nära arkitektonisk koppling till numpy.
dtypen för en kolumn behöver inte på något sätt korrelera med pytontypen för objektet i kolumnen.
Här har vi en pd.Series
med flottörer. Dtypen kommer att float
.
Sedan använder vi astype
att "kasta" den till objekt.
pd.Series([1.,2.,3.,4.,5.]).astype(object)
0 1
1 2
2 3
3 4
4 5
dtype: object
Dtypen är nu objekt, men objekten i listan flyter fortfarande. Logiskt om du vet att i python är allt ett objekt och kan överföras till objekt.
type(pd.Series([1.,2.,3.,4.,5.]).astype(object)[0])
float
Här försöker vi "gjuta" flottörerna till strängar.
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
Dtypen är nu objekt, men typen av poster i listan är sträng. Detta beror på att numpy
inte hanterar strängar och därmed fungerar som om de bara är föremål och utan bekymmer.
type(pd.Series([1.,2.,3.,4.,5.]).astype(str)[0])
str
Lita inte på typer, de är en artefakt av en arkitektonisk brist i pandaer. Ange dem som du måste, men lita inte på vilken dtype som är inställd i en kolumn.
Kontrollera kolumntyperna
Kolumntyper kan kontrolleras med .dtypes
atrribute för 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
För en enda serie kan du använda .dtype
attribut.
In [4]: df['A'].dtype
Out[4]: dtype('int64')
Ändra dtyper
astype()
-metoden ändrar dtypen för en serie och returnerar en ny serie.
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
Ändra typen av kolumn A för att flyta och typ av kolumn B till heltal:
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()
-metoden är för specifik typkonvertering (dvs. du kan ange .astype(float64')
, .astype(float32)
eller .astype(float16)
). För allmän konvertering kan du använda pd.to_numeric
, pd.to_datetime
och pd.to_timedelta
.
Ändra typen till numerisk
pd.to_numeric
ändrar värdena till en numerisk typ.
In [6]: pd.to_numeric(df['E'])
Out[6]:
0 1
1 2
2 3
Name: E, dtype: int64
Som standard ger pd.to_numeric
ett fel om en ingång inte kan konverteras till ett nummer. Du kan ändra beteendet med hjälp av 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
Kontrollera vid behov alla rader med ingång inte kan konverteras till numerisk användning boolean indexing
med 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
Ändra typ till 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]
Observera att 2.1.2011 konverteras till 1 februari 2011. Om du vill ha 2 januari 2011 istället måste du använda parametern dayfirst
.
In [13]: pd.to_datetime('2.1.2011', dayfirst=True)
Out[13]: Timestamp('2011-01-02 00:00:00')
Ändra typ till timedelta
In [14]: pd.to_timedelta(df['D'])
Out[14]:
0 1 days
1 2 days
2 3 days
Name: D, dtype: timedelta64[ns]
Välja kolumner baserade på dtype
select_dtypes
metoden kan användas för att välja kolumner baserade på 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
Med include
och exclude
parametrar kan du ange vilka typer du vill:
# 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
Sammanfattning av typtyper
metoden get_dtype_counts
kan användas för att se en uppdelning av dtyper.
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