Quantcast
Channel: pandas - よちよちpython
Viewing all articles
Browse latest Browse all 30

【Pandas】データフレームの日付による条件抽出の方法

$
0
0

今回は、Pandasを使った日付の条件抽出の練習です。



【実行環境】



目次





データフレームを日付で条件抽出

日付による条件抽出をやってみる。



◇ 連続日付データの生成

import pandas as pd
import numpy as np

# データフレーム生成
df=pd.DataFrame({
    '日付':pd.date_range(start="2021/1/1",freq="d",periods=20),
    '何かの値':np.random.randint(1,51,20),
    'アイテム':np.random.choice(['砂糖','醤油','酢','みりん','塩','ごま油','鰹だし','昆布だし','アゴだし','味噌'], 20)
})

df
日付何かの値アイテム
02021-01-016砂糖
12021-01-0241ごま油
22021-01-0325
32021-01-0436ごま油
42021-01-0526ごま油
52021-01-0613ごま油
62021-01-0713
72021-01-0816昆布だし
82021-01-0913
92021-01-1045
102021-01-1132アゴだし
112021-01-1215
122021-01-1317ごま油
132021-01-144鰹だし
142021-01-1512砂糖
152021-01-1611アゴだし
162021-01-1725昆布だし
172021-01-1831砂糖
182021-01-1929
192021-01-2035昆布だし



query()の条件抽出の練習

df.query()を使って条件抽出する場合、

  • 引数の中身全体 : シングルクォーテーション「'」で括ります。
  • データの値 : str型の値はダブルクォーテーション「"」で括る。
  • データの値 : 数値型はクォーテーシふョンを付けない。
  • カラム名やインデックス名 : クォーテーションは付けず、そのまま



例1)
↑のデータの、「アイテム列がアゴだしを抽出」の場合、query()の引数は

'アイテム == "アゴだし"'

にする。

やってみましょ。

# アイテム列が「アゴだし」のデータを抽出
df.query('アイテム == "アゴだし"')
日付何かの値アイテム
102021-01-1132アゴだし
152021-01-1611アゴだし



例2)
「何かの値」列が15以上25未満のデータを抽出。

# 何かの値列が15以上25未満のデータを抽出
df.query('15 <= 何かの値 < 25')
日付何かの値アイテム
72021-01-0816昆布だし
112021-01-1215
122021-01-1317ごま油



例3)
何かの値列が30以上で、かつ、アイテムが塩ではないデータを抽出。

# 何かの値が30以上で、かつアイテムが塩ではないデータ
df.query('30 <= 何かの値 and アイテム != "塩"')
日付何かの値アイテム
12021-01-0241ごま油
32021-01-0436ごま油
102021-01-1132アゴだし
172021-01-1831砂糖
192021-01-2035昆布だし



例4)
何かの値が10未満、もしくは40より大きいデータを抽出。

# 何かの値が10未満、もしくは40より大きいデータを抽出
df.query('何かの値 < 10 or 40 <= 何かの値')

日付何かの値アイテム
02021-01-016砂糖
12021-01-0241ごま油
92021-01-1045
132021-01-144鰹だし

練習はこのへんにして、日付データの抽出に進みます。

df.query()で日付から条件抽出

数値型はダブルクォーテーションを付けませんでしたが、日付型はダブルクォーテーションが必要です。付けないとエラーが出る。

日付が1/5よりあとで、1/8より前のデータを抽出。

# 日付で条件抽出
df.query('"2021-01-05" < 日付 < "2021-01-08"')
日付何かの値アイテム
52021-01-0613ごま油
62021-01-0713



日付プラス他で条件抽出

and(かつ)で条件を組み合わせて抽出。



日付が1/1以降で1/8より前、かつ何かの値が3以上15未満のデータを抽出。

# 日付と他の列のデータから条件抽出
df.query('"2021-01-01" <= 日付 < "2021-01-08" and 3 <= 何かの値 < 15')
日付何かの値アイテム
02021-01-016砂糖
52021-01-0613ごま油
62021-01-0713

1/1と1/6と1/7の3つが抽出された。本当に合ってるのか、条件を個別に確認します。

# 日付の条件
left = df.query('"2021/1/1" <= 日付 < "2021/1/8"')
left
日付何かの値アイテム
02021-01-016砂糖
12021-01-0241ごま油
22021-01-0325
32021-01-0436ごま油
42021-01-0526ごま油
52021-01-0613ごま油
62021-01-0713

日付の書き方2021-01-01じゃなく2021/1/1でもエラーなく実行できた。

# 何かの値が3以上15未満
right = df.query('3 <= 何かの値 < 15')
right
日付何かの値アイテム
02021-01-016砂糖
52021-01-0613ごま油
62021-01-0713
82021-01-0913
132021-01-144鰹だし
142021-01-1512砂糖
152021-01-1611アゴだし

無駄にleftrightと変数に代入させたのは、データフレームの結合の練習の為w

inner結合すれば、2つの条件に合うデータだけが残るだろう!! ( ・`д・´)

# 条件抽出した2つをinner結合
pd.merge(left, right, on="日付", how="inner")

日付何かの値_xアイテム_x何かの値_yアイテム_y
02021-01-016砂糖6砂糖
12021-01-0613ごま油13ごま油
22021-01-071313

3つが残った。合ってるということで。



df.query()を使わず日付で条件抽出

クォーテーションはシングルでもダブルでもよし。
日付の書き方も以下の通り自由度が高い。

# 日付で条件抽出
df[df['日付'] > '2021/1/15']

#df[df['日付'] > '2021-1-15'] #でも同じ#df[df['日付'] > "1/15/2021"] #でも同じ
日付何かの値アイテム
152021-01-1611アゴだし
162021-01-1725昆布だし
172021-01-1831砂糖
182021-01-1929
192021-01-2035昆布だし



日付列がインデックスの時の条件抽出

日付列をインデックスに変更して行ってみる。

# 日付列をインデックスに変更
dti = df.set_index('日付')
dti.head(3)
何かの値アイテム
日付
2021-01-016砂糖
2021-01-0241ごま油
2021-01-0325
# 日付による条件抽出 (月、日、年の順序でもできる)
dti[dti.index < '1/7/2021']
何かの値アイテム
日付
2021-01-016砂糖
2021-01-0241ごま油
2021-01-0325
2021-01-0436ごま油
2021-01-0526ごま油
2021-01-0613ごま油

日付列をインデックスに変更しているので、条件もインデックスに対して行う。



一定期間ごとの集計

年ごと、月ごと、週ごと、四半期ごとなど、一定期間の集計を行いたい場合、条件抽出をしてからsum()mean()で集計するという手間を掛けずに、df.resample()を使った以下のような方法で簡単に出来ます。

注意として、このとき使用するデータフレームは日付列がインデックスになっている必要があります。

# 使用するデータフレーム 上の三行を表示
dti.head(3)
何かの値アイテム
日付
2021-01-016砂糖
2021-01-0241ごま油
2021-01-0325
# 5日ごとの集計、平均
dti.resample('5d').mean()
何かの値
日付
2021-01-0126.8
2021-01-0620.0
2021-01-1116.0
2021-01-1626.2
# 週ごとの集計、合計
dti.resample('w').sum()
何かの値
日付
2021-01-0372
2021-01-10162
2021-01-17116
2021-01-2495



resample()の使い方はこちらを参考ください。
【Pandas resample()】月別集計、時系列データを期間ごとに集計する方法 - よちよちpython



おわりに

条件抽出はデータ分析100本ノックなどに正規表現を混ぜたり高度な方法を知らないと出来ないようなものが載っていたので、勉強が進んでからでも詳しくやろうかと思います。

以上です。


Viewing all articles
Browse latest Browse all 30

Trending Articles