python – pandas dataframeをfor loop
今回は、業務の中で頻繁に使用するpandas dataframeのcolumn / row毎の処理をfor loopで繰り返し処理させてみようと思います。
今回はcalifornia_housingのデータを使用しますが、業務ではcsvファイルやexcelファイルのケースもあると思います。その場合は、こちらの記事をご参考ください。
1. データ準備
データ準備として、今回はsklearn.datasetsのcalifornia_housingを使用していきます。このデータは回帰用のSampleデータとして使用できますので、必要に応じて使用してみてください。また、pandas.dataframeを使用するので、pandasもimportします。
In [1]: import pandas as pd
...: from sklearn.datasets import fetch_california_housing
sklearn.datasetsのcalifornia_housingのデータを変数に格納します。
In [2]: california_housing = fetch_california_housing()
california_housingのデータをpandas.dataframeに変換します。
In [3]: df = pd.DataFrame(california_housing.data, columns=california_housing.feature_names)
...: df.head()
Out[3]:
MedInc HouseAge AveRooms AveBedrms Population AveOccup Latitude Longitude
0 8.3252 41.0 6.984127 1.023810 322.0 2.555556 37.88 -122.23
1 8.3014 21.0 6.238137 0.971880 2401.0 2.109842 37.86 -122.22
2 7.2574 52.0 8.288136 1.073446 496.0 2.802260 37.85 -122.24
3 5.6431 52.0 5.817352 1.073059 558.0 2.547945 37.85 -122.25
4 3.8462 52.0 6.281853 1.081081 565.0 2.181467 37.85 -122.25
dataframeの先頭5件を別のdataframeに格納します。
In [4]: df_1 = df.head()
...: df_1
Out[4]:
MedInc HouseAge AveRooms AveBedrms Population AveOccup Latitude Longitude
0 8.3252 41.0 6.984127 1.023810 322.0 2.555556 37.88 -122.23
1 8.3014 21.0 6.238137 0.971880 2401.0 2.109842 37.86 -122.22
2 7.2574 52.0 8.288136 1.073446 496.0 2.802260 37.85 -122.24
3 5.6431 52.0 5.817352 1.073059 558.0 2.547945 37.85 -122.25
4 3.8462 52.0 6.281853 1.081081 565.0 2.181467 37.85 -122.25
2. pandas.dataframeのcolumnをloop
では、前のセクションで作成したdataframeを使用して、columnをループさせて標準出力してみます。
In [6]: for col_name in df_1:
...: print(col_name)
MedInc
HouseAge
AveRooms
AveBedrms
Population
AveOccup
Latitude
Longitude
業務でよく使うパターンとして、featureが100とか非常に多い場合、特定のtypeを一括でキャストする場合に少し便利かもしれません。以下の例では、float型のカラムとtypeを標準出力しています。
In [7]: for col_name in df_1:
...: if 'float' in str(df_1[col_name].dtypes):
...: print("{}\t{}".format(col_name, df_1[col_name].dtypes))
MedInc float64
HouseAge float64
AveRooms float64
AveBedrms float64
Population float64
AveOccup float64
Latitude float64
Longitude float64
実際に型変換した例は以下のようになると思います。df_1を複製してからfor loopを実行しています。今回は全てfloatでしたが、実務では様々なtypeが混在しているので、時々役立ちます。ここでは、float64をint64に変換しています。
In [8]: df_2 = df_1.copy()
...: for col_name in df_2:
...: if 'float' in str(df_2[col_name].dtypes):
...: df_2[col_name] = df_2[col_name].astype(int)
...:
...: df_2.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 5 entries, 0 to 4
Data columns (total 8 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 MedInc 5 non-null int64
1 HouseAge 5 non-null int64
2 AveRooms 5 non-null int64
3 AveBedrms 5 non-null int64
4 Population 5 non-null int64
5 AveOccup 5 non-null int64
6 Latitude 5 non-null int64
7 Longitude 5 non-null int64
dtypes: int64(8)
memory usage: 448.0 bytes
3. pandas.dataframeのrowをfor loop
pandas.dataframeのrow(行)をfor loopしてみます。いくつか方法はありますが、オーソドックスな方法を記載してみます。
ターゲットとするrowを見てみます。
In [9]: df_1.head(1)
Out[9]:
MedInc HouseAge AveRooms AveBedrms Population AveOccup Latitude Longitude
0 8.3252 41.0 6.984127 1.02381 322.0 2.555556 37.88 -122.23
for loopで表示してみます。行数が大きくなるので、.head(1)で1件だけ表示していますが、dfを.iterrows()で変換しています。
In [10]: for index, row in df_1.head(1).iterrows():
...: print(index, row)
...:
0 MedInc 8.325200
HouseAge 41.000000
AveRooms 6.984127
AveBedrms 1.023810
Population 322.000000
AveOccup 2.555556
Latitude 37.880000
Longitude -122.230000
Name: 0, dtype: float64
次に、Population columnをloopしてみます。今回は全レコードをloopします。
Population列の値を確認してみます。
In [11]: df_1.Population
Out[11]:
0 322.0
1 2401.0
2 496.0
3 558.0
4 565.0
Name: Population, dtype: float64
for loopで回して、Populationの値を標準出力してみます。
In [12]: for index, row in df_1.iterrows():
...: print('{}\t{}'.format(index, row.Population))
...:
0 322.0
1 2401.0
2 496.0
3 558.0
4 565.0
まとめ
ということで今回は、python – pandas dataframeをfor loopについての覚書を記載してみました。他にも非常にたくさんの実装方法がありますが、今回は使用頻度の高くベーシックなものについて記載してみました。