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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow