昨日に引き続き、Qiitaの「データ分析で頻出のPandas基本操作」を使って勉強しています。
https://qiita.com/ysdyt/items/9ccca82fc5b504e7913a
以下、途中から。
(赤字やスクショは自分でのメモ)
③ データの整形(データ型変更、列名変更、並び替えなど)
- df.sort_index() dfのindexでソートする。
- df.resample() dfを月単位で平均値を出力。df.resample('M').mean() で、「月」単位で「平均値」を出力。単位と処理は、以下のように他にも選べる。
- df.apply() 以下のように、指定した列ごとに関数を適用できる。
- pd.cut() # cutメソッドでヒストグラムのビン指定的な処理ができる
labels = ['上旬','中旬','下旬']
df['period'] = pd.cut(list(df['day']), bins=[0,10,20,31], labels=labels, right=True)
これで、period列に、dayに応じた時期(上旬: 0<day≦10, 中旬:10<day≦20, 下旬:20<day≦31)が入った列ができる。
④ データの欠損状態の確認
- df.isnull() 列単位で 欠損値NaN(not a number)が入っている個数をカウントする (正確には、isnull()でtureが返ってくる個数をカウントしている)
- df.any() いずれかの要素が
TrueであればTrueを返す。df[df.isnull().any(axis=1)].head() で 1つでもNaNが含まれる行だけを抽出(最初の5行のみ表示)
⑤ 値(欠損)の置き換えや削除
- df.fillna() df.fillna(value={'payday': 0.0}, inplace=True)で、payday列のNaNを0.0に置き換え。
- df.dropna() df.dropna(subset=['kcal'],axis=0, inplace=True)で、'kcal'列にNaNがある行を削除する。
- df.replace() df['precipitation'] = df['precipitation'].replace('--',0).astype(float)で、precipitation列の「--」を0に置き換え。
- df.mask() df['new_sales'] = df['sales'].mask(df['sales'] > 80, 100)で、new_sales列に、sales列の値が80より大きい場合は100に置き換えたデータを代入。
- df.drop() df.drop(['remarks'], axis=1, inplace=True)で、remark列ごと削除。
⑥ 集計
- df.value_counts() 列ごとに集計。
- df.groupby() 列ごとに指定した項目を集計。count()の部分は、mean()、sum()などでもOK.
- df.diff() 前行との差分を計算。df['temperature_diff'] = df['temperature'].diff(periods=1)で、temperature_diff列ができる。
- df.rolling() 任意のwindowサイズの移動平均を計算。df['temperature_rolling_mean'] = df['temperature'].rolling(window=3).mean()で、temperature_rolling_mean列ができる。
- df.pct_change() 変化率を計算。(x(n) - x(n-1)) / x(n-1) df['temperature_pct_change'] = df['temperature'].pct_change()で、temperature_pct_change列ができる。
今日で昨日の残り分を全部終わらせる予定でしたが、結局、データの可視化などの部分は明日へ残すこととなりました。
とはいえ、ここまででも地味に疲れました。。
普段はこういったデータの前処理系はawkやunixコマンドを使ってガリガリ自分で書いているので、新しい言語を覚えるって正直面倒臭いところもあります。
まぁ、pythonを勉強しているモチベーションはpythonにしかないようなライブラリを使いたいってことなので、
今日やったような部分はこれまでどおり自分が慣れている方法で処理すれば良いし、今更学ばなくても良いのでは!?と何度も思いかけましたが・・。
でも!!
今後は、人が書いたコードを読んだり改良しないといけない時もあるだろうし、長期的に見れば覚えておいて損はないのだろう。。
というわけで、引き続き明日も頑張ります。
癒し画像を貼っておきます。







