dfの型を調べ、必要な型に変更する
最終更新日:2021/7/4
DataFrame(df)の型を調べ、必要に応じ、型を変更することはとても重要です。ここを理解できていないと、いつまでも欲しいデータが作れません。或いは、データを作るのに無駄な時間を割いてしまうことになります。
【説明すること】
ここでは以下のcsvファイルをインポートして、コードを書いています。ファイルはリンク先からダウンロードするか、コピーして、ご自身でcsvファイルにしてください。
ダウンロードする際は、拡張子がデフォルトで.txtになるので、.csvに手入力して変更してください。
pd.read_csv()で読み込むと、以下のようになります。
1. 型を確認する: df.dtypes
df.dtypes
で全ての列の型が表示されます。なお、df.dtypes()ではありません。最後のカッコは不要です。
特定の列の型を確認したい場合には、df1[‘clm1’].dtypes
のように列を指定すればいいです。
2. 型を変換する
df.astype()
で型の変更・変換が可能です。以下で変更する型を指定します。
文字列型:str
int型(整数):int
float型(浮動小数点): float
datetime型への変更は、後で説明するdf.to_datetime()
で行います。(2.3 datetime型への変換)
コードは、受け皿を書かないと、元のdfは変更されません。元のdfも変更したい場合は、同じカラム名(列名)を指定して、
df1[‘clm1’] = df1[‘clm1’].astype(float)
と書きます。
しかし、自由に型を変更できるわけではありません。例えば、文字列をfloatに変換する事はできません。エラーとなります。
ただし、後述するようにobject型の列が数値と文字列の混在で、文字列を除き、数値だけに絞り込んだ後であれば変更可能です。
2.1. int型、float型(数値)からobject型(文字列)への変換
※int, float => object
例えば、数値を文字列の数字にしたい場合があります。見た目はどちらも同じですが、与えられたデータの形式上、文字列の数字を扱う場合があります。
金融データの場合、4桁の証券コードにこの傾向が見られます。
この場合str
を指定すれば、object型になります。
df2a['clm1'] = df2a['clm1'].astype(str)
まず、変更する前に同じfloatどうしの’clm1’と’clm3’の和が計算できることを見てみます。結果を新しいカラム’sum1’に入れます。
df['カラム名'].astype(str)
とすれば、object型に変更されます。
こうすると、上のような’clm1’と’clm3’の和は計算できず、エラーとなります。’clm1’はobject(文字列)で’clm3’が数値だからです。
しかし、object型にしたことで、文字列同志の結合が可能となります。
例えば、以下の’sum2’は、’clm1’に’A’を結合した文字列です。
2.2 object型からint型, float型への変換
※object => int, float
文字列と数値が混在しているとobject型となり、このままではint型やfloat型への変換はできません。しかし、文字列を除いた後であれば可能です。
以下では、列’clm5’の最後が’AAA’の文字列のため、object型となっています。しかし、’AAA’を除いた後のdfであれば、変換が可能です。
df2はdf1の最終行を除いてコピーしたもので、この時点では’clm5’はobject型が引き継がれています。
df2['clm5'] = df2['clm5'].astype(float)
でfloat型に変化すると、エラーは発生せず、float型になります。
以下では、最終行を除いて、df2にdf1を コピーします。すると、df2にdf1の’AAA’は含まれません。
最初に、この状態での型を確認します。’clm5’はdf1の型であるobject型を引き継いでいます。
ここで’clm5’をfloat型に変更します。dtypes()でfloat型に変更されているのがわかります。
その証拠に、’clm0’と’clm5’の和を新しいカラム’sum3’に入れる、という操作を行うと、エラーとならず、計算が可能です。
2.3 datetime型への変換
※=>datetime
.to_datetime()
を使い、カラム名を指定して、以下のように書きます。 df1['ValueDate'] = pd.to_datetime(df1['ValueDate'])
datatime型への変更は.astype()
では出来ません。
datetime型のどこがいいのか?
詳細は他のセクションで説明しますが、datetime型にして、それをindexに用いると、コードが簡素になり、とても便利です。
株価など、時系列データを扱う場合には、indexをdatetime型にする、は定石です。
2.4 csvファイルのIndexをdatetime型で読み込む
株価などの、元のファイルに日付が入った時系列データを扱う場合は、pd.read_csv()
で読み込む際に、datetime型でindexにしてしまうと楽です。
これは、pd.read_csv()
のオプションで、indexにするカラム(列)をindex_col=0
(列番号)または” index_col=’ValueDate’
(列名)を指定して、parse_dates=True
を指定します。