Pandas でデータフレームを縦持ちに整形! stack メソッドと unstack メソッド

2024-04-02

Pandas DataFrame の stack メソッド

概要

使用例

列をインデックスに昇格

次の例では、dfCountry 列を新しいインデックスレベルに昇格し、Product 列を値として格納する Series を返します。

import pandas as pd

df = pd.DataFrame({'Country': ['USA', 'Canada', 'USA'], 'Product': ['iPhone', 'iPad', 'Macbook']})

# 列をインデックスに昇格
stacked_series = df.stack()

print(stacked_series)

# 出力
# Country  Product
# USA     iPhone
# Canada  iPad
# USA     Macbook

複数の列をインデックスに昇格

level パラメータを使用して、複数の列を新しいインデックスレベルに昇格することができます。

stacked_df = df.stack(level=['Country', 'Product'])

print(stacked_df)

# 出力
# Country  Product
# USA     iPhone
#         iPad
#         Macbook
# Canada  iPad

欠損値の処理

dropna パラメータを使用して、欠損値を含む行をスタッキング結果から除外することができます。

df.loc[1, 'Product'] = None

stacked_series = df.stack(dropna=False)

print(stacked_series)

# 出力
# Country  Product
# USA     iPhone
# Canada  NaN
# USA     Macbook

メソッドの詳細

引数説明
levelスタッキングする列の名前
dropna欠損値を含む行を削除するかどうか (デフォルト: True)
  • stack メソッドは、unstack メソッドと逆の操作を行います。

練習問題

次の DataFrame を使用して、stack メソッドを試してみましょう。

df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]})
  1. A 列を新しいインデックスレベルに昇格し、B 列を値として格納する Series を作成してください。
  2. AB 列を新しいインデックスレベルに昇格し、C 列を値として格納する DataFrame を作成してください。
  3. 欠損値を含む行を削除して、A 列を新しいインデックスレベルに昇格し、B 列を値として格納する Series を作成してください。


Pandas DataFrame の stack メソッド サンプルコード

列をインデックスに昇格

import pandas as pd

df = pd.DataFrame({'Country': ['USA', 'Canada', 'USA'], 'Product': ['iPhone', 'iPad', 'Macbook']})

# 列をインデックスに昇格
stacked_series = df.stack()

print(stacked_series)

# 出力
# Country  Product
# USA     iPhone
# Canada  iPad
# USA     Macbook

複数の列をインデックスに昇格

stacked_df = df.stack(level=['Country', 'Product'])

print(stacked_df)

# 出力
# Country  Product
# USA     iPhone
#         iPad
#         Macbook
# Canada  iPad

欠損値の処理

df.loc[1, 'Product'] = None

stacked_series = df.stack(dropna=False)

print(stacked_series)

# 出力
# Country  Product
# USA     iPhone
# Canada  NaN
# USA     Macbook

レベル名の変更

stacked_series = df.stack(level=['Country', 'Product'], names=['Country', 'Category'])

print(stacked_series.name)

# 出力
# (Country, Category)

集計関数の適用

# 各国の製品の平均価格を計算
stacked_df = df.set_index(['Country', 'Product']).stack()
stacked_df = stacked_df.groupby('Country').mean()

print(stacked_df)

# 出力
# Country  Product
# USA     iPhone     1500
#         iPad      1000
#         Macbook    2000
# Canada  iPad      1200

マルチレベルインデックスへの変換

# マルチレベルインデックスに変換
stacked_df = df.stack(level=['Country', 'Product']).unstack('Product')

print(stacked_df)

# 出力
# Country  iPhone  iPad  Macbook
# USA        1500    1000     2000
# Canada     NaN     1200      NaN

辞書への変換

# 辞書に変換
stacked_dict = df.stack().to_dict()

print(stacked_dict)

# 出力
# {'USA': {'iPhone': 1500, 'iPad': 1000, 'Macbook': 2000}, 'Canada': {'iPhone': None, 'iPad': 1200, 'Macbook': None}}

NumPy 配列への変換

# NumPy 配列に変換
stacked_array = df.stack().to_numpy()

print(stacked_array)

# 出力
# [[1500 1000 2000]
#  [nan 1200 nan]]

練習問題

df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]})

解答

stacked_series = df.set_index('A')['B']

print(stacked_series)

# 出力
# A
# 1    4
# 2    5
# 3    6
stacked_df = df.set_index(['A', 'B'])['C'].unstack()

print(stacked_df)

# 出力
# A  1  2  3
# B
# 4  7  8  9
df.dropna(inplace=True


Pandas DataFrame の stack メソッドの代替方法

set_index と unstack メソッド

# 列をインデックスに昇格
df = df.set_index('Country')

# 新しいインデックスレベルを作成
df = df.unstack('Product')

print(df)

# 出力
# Country  iPhone  iPad  Macbook
# USA        1500    1000     2000
# Canada     NaN     1200      NaN

melt メソッド

# DataFrame を "長い形式"に変換
df = df.melt(id_vars=['Country'], value_vars=['Product', 'Price'])

# 列をインデックスに昇格
df = df.set_index(['Country', 'Product'])

print(df)

# 出力
# Country  Product  Price
# USA     iPhone     1500
# USA     iPad      1000
# USA     Macbook    2000
# Canada  iPad      1200

辞書への変換

# DataFrame を辞書に変換
df_dict = df.to_dict(orient='index')

# 列をインデックスに昇格
for country, product_prices in df_dict.items():
    df_dict[country] = {product: price for product, price in product_prices.items()}

print(df_dict)

# 出力
# {'USA': {'iPhone': 1500, 'iPad': 1000, 'Macbook': 2000}, 'Canada': {'iPad': 1200}}

NumPy 配列への変換

# DataFrame を NumPy 配列に変換
df_array = df.to_numpy()

# 列をインデックスに昇格
df_array = np.stack(df_array, axis=1)

print(df_array)

# 出力
# [[1500 1000 2000]
#  [nan 1200 nan]]
  • 複数の列を新しいインデックスレベルに昇格したい場合は、set_indexunstack メソッドが最も効率的です。
  • DataFrame を "長い形式"に変換したい場合は、melt メソッドが便利です。
  • 辞書や NumPy 配列に変換したい場合は、それぞれの変換メソッドを使用できます。

stack メソッドは、DataFrame の列を新しいインデックスレベルに再配置する便利な方法です。しかし、他の方法もありますので、状況に応じて適切な方法を選択してください。




Stack Overflow での Pandas Nano.rollforward に関する質問と回答

pandas. tseries. offsets. Nano は、ナノ秒単位で日付を調整するためのオフセットです。Nano. rollforward メソッドは、指定された日付を次のナノ秒境界にロールフォワードします。これは、高精度な時間系列データの分析で特に役立ちます。



BusinessHour.is_on_offset を使って効率的にビジネス時間処理

BusinessHour. is_on_offset は、Data Offsets の中でも、ビジネス時間 に関する判定を行う関数です。この関数は、指定された日時が、ビジネス時間かどうかを判断します。BusinessHour. is_on_offset(dt)


pandas FY5253Quarter.apply:四半期末オフセットを使いこなして業務効率アップ

pandas. tseries. offsets. FY5253Quarter. apply は、四半期末 を基準とした日付オフセットを、指定された日付範囲に適用する関数です。機能指定された日付範囲に、四半期末オフセットを繰り返し適用します。


Pandas.tseries.offsets.BusinessHour.weekmask徹底解説

pandas. tseries. offsets. BusinessHour. weekmask は、BusinessHour オブジェクトで使用される属性で、曜日ごとにビジネスデーとして扱われるかどうかを指定します。デフォルトでは月曜日から金曜日までの営業日がビジネスデーとなりますが、weekmask を使用して、この設定を変更することができます。


Pandasで秒単位のオフセットを扱う:Second.apply完全ガイド

Second. apply は、Data Offsets の中でも秒単位でオフセットを適用するための関数です。この関数を使うと、指定された日付や時刻に秒単位でオフセットを加算したり減算したりすることができます。この解説では、以下の内容について説明します。



pandas.core.groupby.GroupBy.apply でカテゴリカル変数をダミー変数に変換して自由自在に分析

pandas. core. groupby. GroupBy. apply は、pandas DataFrames をグループ化し、各グループに対して関数を適用して結果を組み合わせて新しい DataFrame を作成する強力なメソッドです。


Pandas Series オブジェクトの name 属性:データフレームとの結合や名前の変更をわかりやすく解説

pandas. Series. name 属性は、Series オブジェクトの名前を設定または取得するために使用されます。名前は、Series オブジェクトを識別したり、データフレームに結合したりする際に役立ちます。設定Series. name 属性は、文字列を直接代入するか、name 引数を使用して設定できます。


Pandas Data Offsets と Tick.kwds で時間操作をマスターする

Tick は、Data Offsets の一種で、マイクロ秒単位の時間間隔を表します。Tick オブジェクトは、pandas. tseries. offsets. Tick クラスを使用して生成されます。Tick. kwds は、Tick オブジェクトを生成する際に使用できるオプション引数の辞書です。この辞書には、以下のキーを指定できます。


【完全ガイド】 pandas.tseries.offsets.YearBegin で年単位のオフセット計算をマスターしよう!

主な用途年始に基づいて日付を操作する年度末などの特定の日付を取得するカレンダーに基づいてオフセットを計算するYearBegin オブジェクトは、以下の要素で構成されます。offset: オフセットの値。正の値の場合は基準日以降、負の値の場合は基準日以前の日付を指します。


BQuarterBegin.kwds のサンプルコード

BQuarterBegin. kwds は、pandas. tseries. offsets. BQuarterBegin クラスで使用されるキーワード引数の辞書です。この辞書は、四半期の開始日をどのように定義するかを指定するために使用されます。