--- 内容 ---
- よく使うフラグの立て方
- 祝日のフラグの立て方(日本)
--- よく使うフラグの立て方 ---
- maskメソッドを利用します。whereメソッドを利用した方法やfor文とif文を使って強引にやる方法もあるのですが、whereはFalseの時に実行を行うので分かりにくく、for文とif文で強引に行く方法はデータフレームを結合(concat)した際に欠損値が生じるケースがあるので使いにくいです。
したがってmaskを利用する方が個人的には圧倒的にやりやすかったです。
[参考] - where
- whereとmaskのQiita記事
- concat時の不整合
方法
方法は簡単で、初めに全行が0の新しいカラムを作る ➡ 条件に合致する箇所を1に変えるの順番になります。
maskの使い方は
df['column_name'] = 0
df['column_name'].mask(条件式, 代入する値, inplace=True)
代入する値はフラグを立てるだけなので1でいいでしょう。
inplaceはTrueでもFalseでも大丈夫です。(元のdfを変えるかどうかなので)
条件式はand, or, notではなく&, |, ~を使う点に注意してください。
--- 祝日フラグの立て方(日本) ---
- jpholidayライブラリを使用します。.is_holidayは日付データを与えると祝日かどうかを判定してくれます。
先ほど同様に全行が0のカラムを新しく作った後にfor文をぶん回して、at関数で代入してあげれば完了です。
今回は下の様なテーブルを作ったとします。
df['holiday'] = 0
df.head(2)
【出力結果】
datetime | holiday | |
---|---|---|
1 | 2000-01-01 | 0 |
2 | 2000-01-02 | 0 |
あとはjpholidayをimportして、for文で行数分だけ代入するだけです。
import jpholiday
for i in range(df.shape[0]):
df.at[i,'holiday'] = jpholiday.is_holiday(df["datetime"].iloc[i])
【出力結果】
datetime | holiday | |
---|---|---|
1 | 2000-01-01 | True |
2 | 2000-01-02 | True |
jpholidayでは元旦も祝日扱いとなります。
jpholiday
このままでは扱いずらいので、1をかけてあげれば0,1の形式に変わります。
(私の環境だけかもしれませんが、*1をしただけだとobject型のままなのでastypeでint型に直しています。)
df['holiday'] = (df['holiday'] *1).astype(int)
以上です。