データ分析実践
中級問題チェック

問題 12 /40

pandasのpivot関数でdf1をdf2に変形した後、melt関数でdf2からdf1に戻す場合、melt関数の正しい記述はどれか。 df1 ▶︎ *「日付」はインデックスのタイトル。カラムのタイトルは無し。「果物名」と「販売数」は列の名前。 df2 ▶︎ *「日付」はインデックスのタイトル。「果物名」はカラムのタイトル。「ぶどう」と「りんご」は列の名前。

選択 1

pd.melt( df2, ignore_index=False, value_vars=['ぶどう','りんご'], value_name='販売数' ).sort_index()

選択 2

pd.melt( df2, value_vars=['ぶどう','りんご'], value_name='販売数' ).sort_index()

選択 3

pd.melt( df2, id_vars='日付', value_vars=['ぶどう','りんご'], value_name='販売数' ).sort_index()

選択 4

pd.melt( df2, ignore_index=False, value_vars='果物名', value_name='販売数' ).sort_index()

解説

選択肢1が正解です。 pivot関数は縦持ちデータを横持ちに変形し、melt関数は横持ちデータを縦持ちに変形します。 df1 = pd.DataFrame( {'果物名':['ぶどう','りんご','ぶどう','りんご'], '販売数':[10,20,30,40]}, index=['1日','1日','2日','2日']) df1.index.name='日付' df1 ▶︎ この縦持ちデータをpivot関数で横持ちに変形します。 df2 = pd.pivot( df1, columns='果物名', values='販売数') df2 ▶︎ このdf2を、melt関数でdf1に戻す記述を考えます。 【選択肢1】 pd.melt( df2, ignore_index=False, value_vars=['ぶどう','りんご'], value_name='販売数' ).sort_index() ▶︎ 正しい結果です。 melt関数の引数は、次の指定になります。 ■ id_vars IDとして使う列を指定。 インデックスにする列名を指定しますが、df2は「日付」のインデックスをIDとして使うため、id_varsは指定しません。 インデックスをIDとして使う場合、「インデックスを無視しない」という意味で「ignore_index=False」をつけます。 ■ value_vars ピボットを解除する列を指定。 一つの列にまとめる列名を指定します。 df2の場合は「ぶどう」と「りんご」を一つの列にまとめて縦持ちにするため、「value_vars=['ぶどう', 'りんご']」とします。 value_varsを指定しなかった場合は、id_varsで指定した列以外のすべての列が解除されます。 ■ var_name value_varsで縦持ちにした列の列名を指定。 df2の「ぶどう」と「りんご」には「果物名」というカラムのタイトルがついているため、var_nameを指定しなくても「果物名」の列名がつきます。「var_name='果物名'」をつけても同じ結果になります。 ■ value_name 値の列につける列名を指定。 ここでは値の列に「販売数」という列名をつけています。 【選択肢2】 pd.melt( df2, value_vars=['ぶどう','りんご'], value_name='販売数' ).sort_index() ▶︎ 誤った結果です。 選択肢1の引数「ignore_index=False」がないため、インデックスが無視されて消えています。 【選択肢3】 pd.melt( df2, id_vars='日付', value_vars=['ぶどう','りんご'], value_name='販売数' ).sort_index() ▶︎ KeyError: "The following id_vars or value_vars are not present in the DataFrame: ['日付']" 誤った結果です。 id_varsはインデックスではなく列名を指定します。選択肢3のようにインデックスを指定するとKeyErrorになります。 df2の「日付」が、次のようにインデックスではなく列であれば、id_varsで指定できます。 df2 = pd.pivot( df1.reset_index(), index='日付', columns='果物名', values='販売数', ).reset_index() df2 ▶︎ *「果物名」はカラムのタイトル。 pd.melt( df2, id_vars='日付', value_vars=['ぶどう','りんご'], value_name='販売数' ).set_index('日付').sort_index() ▶︎ value_varsを指定しなかった場合は、すべての列が解除されます。「ぶどう」と「りんご」は、id_varsで指定した「日付」以外の全ての列になるため、「value_vars=['ぶどう', 'りんご']」の引数がなくても同じ結果になります。 各引数のイメージは以下です。
melt関数の引数は紛らわしいので、この図をイメージすると覚えやすいかもしれません。 【選択肢4】 pd.melt( df2, ignore_index=False, value_vars='果物名', value_name='販売数' ).sort_index() ▶︎ KeyError: "The following id_vars or value_vars are not present in the DataFrame: ['果物名']" 誤った結果です。 value_varsは「value_vars=['ぶどう', 'りんご']」のように、縦持ちにする列名を指定します。「果物名」は列名ではなくカラムのタイトルのため、KeyErrorになります。 (公式書籍 p.93-94)