メモ書き、これまでexcelで頑張ってたことをPythonに置き換える中で調べたことをメモメモ
pandasとnumpy使えるようにトレーニング中
超初心者なのでこれが最適なのかは不明、今後の自分に期待
データを連結させる(縦方向)
pd.concat([dfA, dfB], ignore_index=True)
ignore_index=True でindexをふり直し。こーゆーの一気にできるのが嬉しい。
データを結合させる(横方向)
1、結合キーとなるカラム名が同じ場合
pd.merge(dfA,dfB[["columnA","columnB","columnC" ]],on = "columnA", how="left")
dfAにdfBを結合。onで結合する際のキーを指定。howで結合方法を指定。
似たようなものにjoinというのもあったけどとりあえずパス。あとで調べる。
2、結合キーとなるカラム名が違う場合
pd.merge(dfA, dfB, left_on = "columnA", right_on = "columnB", how="left")
left_onとright_onでカラム名指定する
売上点数と商品単価から売上列を作る
df['sales'] = df['quantity'] * df['price']
作る列名を指定して、単純に掛け算。売上は英語でsalesであってるのか。知らん。
基本統計量の把握
df.describe()
これほんと便利。Pythonに置き換える決意して良かったと思う瞬間。
入力がめちゃくちゃな日付を統一する
1、数値データを日付に変換
zzz = df['datetime'].astype(str).str.isdigit()
xxx = pd.to_timedelta(df.loc[zzz, 'datetime'].astype('float'), unit='D')+pd.to_datetime("1900/01/01")
1行目で数値データとして取り込んでしまったものを特定している。.str.isdigit()は「全ての文字が数字なら真、そうでなければ偽」
2行目で数値をDatetime型に変換。to_timedeltaでDatetime型に変換。
2、正しいデータも念のため書式統一
yyy = pd.to_datetime(df.loc[~zzz, 'datetime'])
区切り文字とかが違うかもしれないので1でやった処理と同様にdatetime型にする。
~zzzでzzzじゃないところ。つまり ~zzz = (zzz = False)
3、変換したデータを結合
df['datetime'] = pd.concat([xxx, yyy])
変換したデータを結合して元のデータ列にあてこむ。これは便利だ
月別でデータ集計(日付データしかない時)
1、年月列を作る
df['datetime'] = pd.to_datetime(df['datetime'])
df['month'] = df['datetime'].dt.strftime('%Y%m')
1行目でdatetime型に変換して、2行目で年月だけを取り出す。
.dt.strftimeで時刻を文字列に変換。
2020/4/1 → 202004
となる。
2、月別集計
df.groupby('month').sum()['sales']
groupbyでまとめたい列を指定。その後に集計方法。売上だけ表示したいので['sales']を記載。
え、まって、めっちゃ楽。
groupbyは階層集計にすることもできる
3、階層集計
df.groupby('month','product_name').sum()['sales']
月別商品別集計のできあがり
ピボットテーブルを作る
pd.pivot_table(df, index='product_name', columns='month', values=['sales'], aggfunc='sum')
長いけどやりたいことを1つ1つ記述しているのでわかりやすい。
行に商品名、列に年月、値は売上、aggfuncは値の集計方法。Excelでやってる時と操作イメージは全く同じ
大文字小文字を統一する
df['product_name'].str.upper()
df['product_name'].str.lower()
df['product_name'].str.capitalize()
1つ目が小文字を大文字に、2つ目が大文字を小文字に、3つ目が先頭文字だけ大文字あとは小文字に
結構使う
余計な空白埋める
df['product_name'].str.replace(' ','')
.str.replaceは文字置き換え。空白を何もない状態に置き換えてる。これも便利
欠損値チェッカー
.df.isnull().any(axis=0)
これで各列に欠損値があるかわかる。True or Falseで返ってきます。axisの方向が覚えられなくて辛い。
まとめ
Excelに比べて慣れると操作が格段に早く、何より検算がかなり早くできる印象。
データ分析前の処理をもっと早くできるように精進しよう。