pandasを用いた気象データベースのハンドリング

Table of Content

(財)気象業務支援センター「気象データベース」をPythonのpandasでハンドリングしたときのtipsです.この気象データの紹介はこちらにありますが,項目毎に値とリマークの時系列が連続したカラムとして収録されています.例として,一部を抜粋し,pandasのDataFrameとして示します.ただし,ダミーの値を入れています.avrLhpaは日平均現地気圧,avrShpaは日平均海面気圧,avrKionは日平均気温です.これらにRMKが付いたものがリマークで,8が正常,1が欠測を意味するとします.欠損の場合は空白になっていて,pandasで自動的にNaNにすることもできますが,一般には値0が入っているけれども欠損値にしたいといった場合もあります.このようにRMKの値に応じてその変数の値をNaN等に書き換える方法を考えます.方針は,対象となるRMKのカラム番号を抽出し,その一つ前の番号のカラムの値を指定した値で置換する,です.

>>> df

            avrLhpa avrLhpaRMK  avrShpa avrShpaRMK  avrKion avrKionRMK
YYYY_MM_DD                      
1961-12-01  1015.8  8   1016.5  8   10.3    8
1961-12-02  1014.2  8        0  3   11.8    8
1961-12-03  1020.0  8   1020.7  8   11.7    8
1961-12-04  1018.0  8   1018.7  8   7.4 8
1961-12-05  1021.1  8   1021.8  8   6.3 8

文字列RMKを含むカラム名をリストとして抽出します.

>>> RMK_cols = [col for col in df.columns if 'RMK' in col]
>>> RMK_cols

['avrLhpaRMK', 'avrShpaRMK', 'avrKionRMK']

カラム名からカラム番号を求める

カラムarvShpaRMKのカラム番号を抽出するには次のようにします.

>>> df.columns.get_loc('avrShpaRMK')

3

よって,idx=3-1=2 が置換対象の avrShpa カラムのid番号になります.

RMKの値が対象値のとき,その変数の値を置換する

avrShpaRMK=3 のときの avrShpa の値を NaN に置換するには以下のようにします.ただし,avrShpa カラムのインデックス番号 idx は上で求めた通り,idx=2 です.

df.iloc[:, idx].mask(df['avrShpaRMK'] == 3, np.nan, inplace=True)

df.iloc[:, idx] で当該カラムを抽出し,.mask()の第1引数に条件を与え,第2引数に置換する値を与えます.第3引数のinplace=Truedf の上書き更新を意味します.

RMK全カラムを対象に指定したRMK値のリストを渡し一度に置換する

以上の方法をRMKカラムのリスト RMK_cols のすべてに拡張し,RMK値が rmk_nans=[1, 3, 4, 5] のときの項目値をすべて NaN にするには,以下のようにforループで回します.

for rmk_col in RMK_cols:
    for rmk_nan in rmk_nans:
        idx = df.columns.get_loc(rmk_col) - 1  # RMKに対応する変数値のカラムインデックス
        df.iloc[:, idx].mask(df[rmk_col] == rmk_nan, np.nan, inplace=True)

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください