python – pandas dataframeをfor loop

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についての覚書を記載してみました。他にも非常にたくさんの実装方法がありますが、今回は使用頻度の高くベーシックなものについて記載してみました。

(Visited 9 times, 1 visits today)