サーチ…
備考
dtypesはパンダに固有のものではありません。それらはnumpyと建築的に密接につながっているパンダの結果です。
列のdtypeは決して列に含まれるオブジェクトのpython型と相関する必要はありません。
ここには浮動小数点数を持つpd.Series
があります。 dtypeはfloat
ます。
次に、 astype
を使ってastype
に「キャスト」します。
pd.Series([1.,2.,3.,4.,5.]).astype(object)
0 1
1 2
2 3
3 4
4 5
dtype: object
dtypeは現在オブジェクトですが、リスト内のオブジェクトはまだ浮動です。論理的には、Pythonではすべてがオブジェクトであり、オブジェクトにアップキャストされていることが分かっています。
type(pd.Series([1.,2.,3.,4.,5.]).astype(object)[0])
float
ここでは、フロートを文字列に「キャスト」します。
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は現在オブジェクトですが、リスト内のエントリのタイプはstringです。これはnumpy
が文字列を処理しないため、それらが単なるオブジェクトであり、懸念されないように動作するためです。
type(pd.Series([1.,2.,3.,4.,5.]).astype(str)[0])
str
dtypesを信用しないでください、彼らはパンダの建築上の瑕疵の成果物です。必要に応じて指定しますが、列にdtypeが設定されているかどうかには依存しません。
列のタイプの確認
カラムのタイプは、 .dtypes
.dtypes属性によってチェックすることができます。
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
単一のシリーズの場合は、 .dtype
属性を使用.dtype
ます。
In [4]: df['A'].dtype
Out[4]: dtype('int64')
dtypeの変更
astype()
メソッドはSeriesのdtypeを変更し、新しいSeriesを返します。
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
列Aの型を浮動小数点に変更し、列Bを整数に変更します。
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()
メソッドは、特定の型変換用です(つまり、 .astype(float64')
.astype(float32)
、または.astype(float16)
を指定できます)。一般的な変換では、 pd.to_numeric
、 pd.to_datetime
、およびpd.to_timedelta
使用できます。
型を数値に変更する
pd.to_numeric
は値を数値型に変更します。
In [6]: pd.to_numeric(df['E'])
Out[6]:
0 1
1 2
2 3
Name: E, dtype: int64
入力が数値に変換できない場合、 pd.to_numeric
はデフォルトでエラーを発生させます。 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
すべての行をチェックする必要がある場合は、入力を数値に変換できないisnull
使用してboolean indexing
を使用する:
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
タイプを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]
2.1.2011は2011年2月1日に変換されます。代わりに2011年1月2日が必要な場合は、 dayfirst
パラメータを使用する必要があります。
In [13]: pd.to_datetime('2.1.2011', dayfirst=True)
Out[13]: Timestamp('2011-01-02 00:00:00')
タイプをtimedeltaに変更する
In [14]: pd.to_timedelta(df['D'])
Out[14]:
0 1 days
1 2 days
2 3 days
Name: D, dtype: timedelta64[ns]
dtypeに基づいて列を選択する
select_dtypes
メソッドを使用すると、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
include
およびexclude
パラメータを使用して、必要なタイプを指定できます。
# 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
dtypesの要約
get_dtype_counts
メソッドを使用すると、dtypesの内訳を見ることができます。
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