Python
 Computer >> コンピューター >  >> プログラミング >> Python

Python・pandasでデータフレームのインデックスを正負の方向に2期間シフトする方法

はじめに

時系列データを扱う際、データを行や列の方向にずらして比較したいケースはよくあります。pandasのshift()メソッドを使えば、データフレームの値を任意の期間だけ簡単にシフトできます。

本記事では、日時をインデックスとするデータフレームを作成し、そのインデックス(行)を正方向に2期間、および負方向に2期間シフトする方法を解説します。

期待される結果

インデックスを正方向に2期間シフトすると先頭の2行がNaN(欠損値)となり、負方向に2期間シフトすると末尾の2行がNaNになります。実行結果は以下の通りです。

正方向に2期間シフトした場合
                    Id   Age
2020-01-01 00:00:00 NaN  NaN
2020-01-01 12:00:00 NaN  NaN
2020-01-02 00:00:00 1.0  10.0
2020-01-02 12:00:00 2.0  12.0
2020-01-03 00:00:00 3.0  14.0

負方向に2期間シフトした場合
                    Id   Age
2020-01-01 00:00:00 3.0  14.0
2020-01-01 12:00:00 4.0  11.0
2020-01-02 00:00:00 5.0  13.0
2020-01-02 12:00:00 NaN  NaN
2020-01-03 00:00:00 NaN  NaN

解決手順

以下の手順で実装を進めます。

  • pd.date_range()を使い、開始日「2020-01-01」、期間数5、頻度「12H」の時系列インデックスを作成する
  • Id列とAge列を持つデータフレームを定義する
  • df.shift(2, axis=0)で正方向に2期間シフトする
  • df.shift(-2, axis=0)で負方向に2期間シフトする

ポイント:shift()メソッドの引数

  • 第1引数(periods):シフトする期間数を指定します。正の値ならデータが後ろへ、負の値なら前へ移動します。
  • axis=0:行方向(インデックス方向)へのシフトを意味します。列方向にシフトしたい場合はaxis=1を指定します。

サンプルコード

それでは、実際のコードを見てみましょう。

import pandas as pd

# 12時間間隔で5個の日時インデックスを作成
time_series = pd.date_range('01-01-2020', periods=5, freq='12H')

# データフレームを定義
df = pd.DataFrame({"Id": [1, 2, 3, 4, 5],
                   "Age": [10, 12, 14, 11, 13]},
                  index=time_series)

print("Dataframe is:\n", df)

# 正方向に2期間シフト
print("shift the index by two periods in positive direction")
print(df.shift(2, axis=0))

# 負方向に2期間シフト
print("shift the index by two periods in negative direction")
print(df.shift(-2, axis=0))

実行結果

Dataframe is:
                     Id  Age
2020-01-01 00:00:00   1   10
2020-01-01 12:00:00   2   12
2020-01-02 00:00:00   3   14
2020-01-02 12:00:00   4   11
2020-01-03 00:00:00   5   13
shift the index by two periods in positive direction
                     Id   Age
2020-01-01 00:00:00  NaN  NaN
2020-01-01 12:00:00  NaN  NaN
2020-01-02 00:00:00  1.0  10.0
2020-01-02 12:00:00  2.0  12.0
2020-01-03 00:00:00  3.0  14.0
shift the index by two periods in negative direction
                     Id   Age
2020-01-01 00:00:00  3.0  14.0
2020-01-01 12:00:00  4.0  11.0
2020-01-02 00:00:00  5.0  13.0
2020-01-02 12:00:00  NaN  NaN
2020-01-03 00:00:00  NaN  NaN

まとめ

pandasのshift()メソッドを使うことで、データフレームの行や列を簡単にシフトできます。正の値を指定するとデータが後ろに移動して先頭側がNaNで埋められ、負の値を指定するとデータが前に移動して末尾側がNaNで埋められます。時系列データの差分計算や前日比の算出など、さまざまな分析の場面で活用できる便利なメソッドなので、ぜひ使いこなしましょう。

  1. Pythonでリスト内の正の数と負の数をカウントする方法【初心者向け解説】

    この記事では、リスト内に含まれる正の数と負の数をそれぞれカウントして表示する方法について解説します。Pythonには複数の実装アプローチがあり、それぞれの特徴を理解することで、状況に応じた最適なコードを書けるようになります。問題定義課題: リスト(イテラブル)が与えられたとき、その中に含まれる正の数と負の数をそれぞれカウントし、結果を表示する必要があります。方法1:forループを使った反復処理= 0」という条件式で正の数かどうかを判定します。条件が真(True)であれば pos_count を、そうでなければ neg_count を1ずつ増やしていきます。サンプルコード= 0:

  2. Pythonでリスト内の正の数と負の数をカウントする方法

    この記事では、リスト内に含まれる正の数と負の数をそれぞれカウントする方法について、2つの異なるアプローチをわかりやすく解説します。 問題定義 リスト(イテラブル)が与えられたとき、その中に含まれる正の数と負の数の個数を数えることを目指します。 ここでは、以下の2つのアプローチを取り上げます。 総当たり(ブルートフォース)方式 lambda関数とfilter関数を組み合わせた方法 アプローチ1:総当たり方式 最も基本的な方法は、forループでリストを順番に走査し、各要素が0以上かどうかを条件分岐で判定するものです。0以上であれば正の数のカウンターを、それ以外の場合は負の数のカウンターを1ずつ