パンダのmelt()関数とpivot()関数を使用して、変形すると戻す。
パンダのmelt()関数は、DataFrameの形式を広い範囲から狭い範囲に変更するために使用されます。この関数は、1つ以上の列が識別子として機能し、残りのすべての列が値として扱われて行方向に展開され、変数と値の2つの列のみが残ります。
1. パンダのmelt()の例
例を通してみると、melt()関数の使用はより明確です。
import pandas as pd
d1 = {"Name": ["Pankaj", "Lisa", "David"], "ID": [1, 2, 3], "Role": ["CEO", "Editor", "Author"]}
df = pd.DataFrame(d1)
print(df)
df_melted = pd.melt(df, id_vars=["ID"], value_vars=["Name", "Role"])
print(df_melted)
出力:
Name ID Role
0 Pankaj 1 CEO
1 Lisa 2 Editor
2 David 3 Author
ID variable value
0 1 Name Pankaj
1 2 Name Lisa
2 3 Name David
3 1 Role CEO
4 2 Role Editor
5 3 Role Author
「var_name」と「value_name」のパラメーターを渡すことで、「variable」と「value」の列名を変更することができます。
df_melted = pd.melt(df, id_vars=["ID"], value_vars=["Name", "Role"], var_name="Attribute", value_name="Value")
おすすめの読み物:Python Pandasのチュートリアル
2. id_varsとして複数の列を指定する
複数の列をid_varsパラメータとして渡した場合、何が起こるか見てみましょう。
df_melted = pd.melt(df, id_vars=["ID", "Name"], value_vars=["Role"])
print(df_melted)
出力:
ID Name variable value
0 1 Pankaj Role CEO
1 2 Lisa Role Editor
2 3 David Role Author
3. melt()関数で列をスキップする
次の例では、「ID」列を省いてもかまいませんが、元のデータフレームからすべての行を使用する必要はありません。
df_melted = pd.melt(df, id_vars=["Name"], value_vars=["Role"])
print(df_melted)
出力:
Name variable value
0 Pankaj Role CEO
1 Lisa Role Editor
2 David Role Author
4. ピボット()関数を使用して、解凍されないデータフレームを生成してください。
DataFrameオブジェクトを「unmelt」(結合)して元のデータフレームを取得するためには、pivot()関数を使用することができます。pivot()関数の「index」パラメーターの値は、「id_vars」の値と同じである必要があります。また、「columns」の値は、「variable」列の名前として渡す必要があります。
import pandas as pd
d1 = {"Name": ["Pankaj", "Lisa", "David"], "ID": [1, 2, 3], "Role": ["CEO", "Editor", "Author"]}
df = pd.DataFrame(d1)
# print(df)
df_melted = pd.melt(df, id_vars=["ID"], value_vars=["Name", "Role"], var_name="Attribute", value_name="Value")
print(df_melted)
# unmelting using pivot()
df_unmelted = df_melted.pivot(index='ID', columns='Attribute')
print(df_unmelted)
出力:
ID Attribute Value
0 1 Name Pankaj
1 2 Name Lisa
2 3 Name David
3 1 Role CEO
4 2 Role Editor
5 3 Role Author
Value
Attribute Name Role
ID
1 Pankaj CEO
2 Lisa Editor
3 David Author
溶けていないDataFrameの値は元のDataFrameと同じです。ただし、列とインデックスにはいくつかの小さな変更が必要です。これにより、元のデータフレームと完全に同じになります。
df_unmelted = df_unmelted['Value'].reset_index()
df_unmelted.columns.name = None
print(df_unmelted)
出力:
ID Name Role
0 1 Pankaj CEO
1 2 Lisa Editor
2 3 David Author
参考: パンダのmelt()関数のAPIドキュメント