Pandas でデータフレームを縦持ちに整形! stack メソッドと unstack メソッド
Pandas DataFrame の stack メソッド
概要
使用例
列をインデックスに昇格
次の例では、df
の Country
列を新しいインデックスレベルに昇格し、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]})
A
列を新しいインデックスレベルに昇格し、B
列を値として格納する Series を作成してください。A
とB
列を新しいインデックスレベルに昇格し、C
列を値として格納する DataFrame を作成してください。- 欠損値を含む行を削除して、
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_index
とunstack
メソッドが最も効率的です。 - 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 クラスで使用されるキーワード引数の辞書です。この辞書は、四半期の開始日をどのように定義するかを指定するために使用されます。