Pythonでデータフレームをさまざまな方法で再形成するプログラムの作成方法
pandasでは、melt()、stack()、unstack()、pivot()といった関数を使うことで、データフレームをさまざまな形に再形成(リシェイプ)できます。本記事では、それぞれの関数の特徴と使い方を、実際のコード例と出力結果とともにわかりやすく解説します。
解決策1:melt()関数でワイド形式をロング形式に変換する
- データフレームを定義します。
melt()関数を適用すると、ワイド形式のデータフレームの列が行方向へ変換されます。
df.melt()
実行例
以下のコードを実行して、動作を確認してみましょう。
import pandas as pd
df = pd.DataFrame({'Id':[1,2,3],'Age':[13,14,13],'Mark':[80,90,85]})
print("Dataframe is:\n",df)
print(df.melt())
出力結果
Dataframe is: Id Age Mark 0 1 13 80 1 2 14 90 2 3 13 85 variable value 0 Id 1 1 Id 2 2 Id 3 3 Age 13 4 Age 14 5 Age 13 6 Mark 80 7 Mark 90 8 Mark 85
melt()を使うと、元々列として並んでいた「Id」「Age」「Mark」が「variable」と「value」の2列からなるロング形式に変換されていることがわかります。可視化や集計処理において、この形式は非常に扱いやすいのが特徴です。
解決策2:stack()/unstack()関数でインデックスの階層を操作する
- データフレームを定義します。
stack()関数を適用すると、データフレームのインデックス階層が1段深くなります。
df.stack().to_frame()
- 変更を元に戻したい場合は、
unstack()を使用します。
df.unstack().to_frame()
実行例
以下の実装例で、挙動を確認してみましょう。
import pandas as pd
df = pd.DataFrame({'Id':[1,2,3],'Age':[13,14,13],'Mark':[80,90,85]})
print("Dataframe is:\n",df)
print(df.stack().to_frame())
print(df.unstack().to_frame())
出力結果
Dataframe is:
Id Age Mark
0 1 13 80
1 2 14 90
2 3 13 85
0
0 Id 1
Age 13
Mark 80
1 Id 2
Age 14
Mark 90
2 Id 3
Age 13
Mark 85
0
Id 0 1
1 2
2 3
Age 0 13
1 14
2 13
Mark 0 80
1 90
2 85
stack()は列を行側へ「積み上げる」操作、unstack()はその逆で行を列側へ展開する操作です。多層インデックスを持つデータを柔軟に組み替えたい場合に便利な関数です。
解決策3:pivot()関数で指定列を基準に再形成する
- データフレームを定義します。
pivot()関数を適用し、「Id」列を基準にデータフレームを再形成します。
df.pivot(columns='Id')
実行例
以下の実装例で、挙動を確認してみましょう。
import pandas as pd
df = pd.DataFrame({'Id':[1,2,3],'Age':[13,14,13],'Mark':[80,90,85]})
print("Dataframe is:\n",df)
print(df.pivot(columns='Id'))
出力結果
Dataframe is:
Id Age Mark
0 1 13 80
1 2 14 90
2 3 13 85
Age Mark
Id 1 2 3 1 2 3
0 13.0 NaN NaN 80.0 NaN NaN
1 NaN 14.0 NaN NaN 90.0 NaN
2 NaN NaN 13.0 NaN NaN 85.0
pivot()は、指定した列の値を新しい列見出しとして展開する関数です。該当しないセルにはNaNが入るため、クロス集計表のような形式を作りたい場合に活用できます。
まとめ
このように、pandasには目的に応じて使い分けられる複数の再形成手段が用意されています。melt()はロング形式への変換、stack()/unstack()はインデックス階層の入れ替え、pivot()は列の展開による表形式の変換に適しています。データの形状を理解した上で最適な関数を選ぶことで、前処理や分析の効率が大きく向上します。
-
Pythonでpandas Seriesから有効な日付だけをフィルタリングする方法
データ分析では、文字列として格納された日付の中から、正しい形式の日付だけを抽出したい場面がよくあります。この記事では、Pythonのpandasと正規表現(reモジュール)を使って、Series内から「YYYY-MM-DD」形式の有効な日付だけをフィルタリングする方法を2通り紹介します。 入力データと期待される出力 次のようなSeriesがあると仮定します。 0 2010-03-12 1 2011-3-1 2 2020-10-10 3 11-2-2 この中で「年4桁・月2桁・日2桁」という形式に合致する有効な日付は、以下の2つです。 0 2010-0
-
Pythonで数Nの桁数を数えるプログラムの書き方
ある数Nが与えられたとき、その数に含まれる桁の総数を求めることを考えましょう。例えば以下のようなケースです。入力例1:N = 891452出力:6解説: 与えられた数891452は6桁の数字で構成されているため、この場合は「6」を返します。入力例2:N = 0074515出力:5解説: 先頭の0を除いた有効な桁数が5桁であるため、出力は「5」となります。この問題を解くためのアプローチこの問題は、次の手順で解決できます。数値nを入力として受け取ります。関数countDigits(n)が入力nを受け取り、桁数をカウントして返します。数値の各桁に対してループ処理を行い、カウンター変数を1ずつ増加させ