はじめに
PandasのDataFrameに列を追加すると末尾に追加されていくが、ファイル出力する際にDataFrameの列順を指定したい時がある。
DataFrameの並び替えと言えばsort_values()やsort_index()だが、どちらも行方向の並び替えで列方向の並び替えには対応していない。
頻繁に使う訳ではないが、忘れた頃に使いたくなるので備忘録として残しておく。
方法
Pandasのlocの引数に並び替えた列名をリストを渡すだけ。
pandas.DataFrame.loc
indexでも同様に任意の順に適応可能。
データ準備
from sklearn.datasets import load_iris
import pandas as pd
# サンプルとしてirisデータを利用
iris = load_iris()
df_iris = pd.DataFrame(iris.data, columns=iris.feature_names)
# 各項目の平均値を求め、サフィックスで列名に"_mean"を付ける
for col in df_iris.columns:
df_iris[col + "_mean"] = df_iris[col].mean()
df_iris.head()
並び替えの指定
# 任意の列順となるリストを作成
# ここではDataFrameの列名リストを取得、昇順に並び替えて使用する
list_col_sorted = df_iris.columns.to_list()
list_col_sorted.sort()
list_col_sorted
['petal length (cm)',
'petal length (cm)_mean',
'petal width (cm)',
'petal width (cm)_mean',
'sepal length (cm)',
'sepal length (cm)_mean',
'sepal width (cm)',
'sepal width (cm)_mean']
結果
# locの引数に並び替えたリストを設定
df_iris.loc[:, list_col_sorted].head()
おわりに
列名でソートしたことで、末尾が"_mean"の列名が元の列のすぐ後に並ぶようになった。
機械学習では数十以上の項目から数百、数千の特徴量を作成することもある。
他にも欠損値フラグを追加する際など、対応する項目が離れていると見辛いのでそうした場面で覚えておくと良い。