python+pandasでSQLみたいな挙動まとめ

python移行をしているのですが、今までSQLでなんども実行していた似たようなSQLが、データフレームの世界になって少し便利になりました。

ということで、そのおさらい。


まず、データフレームとしてraw型のデータを取ってきます。
これ自体はよくやるのですが、取ってきた後で結局サマリ情報が欲しいよね、というケースがあります。
それをデータフレームから作る時にこういう風にやると見やすくなった、という例。

データの仕組み)
df
 category,  --これでgroup by とりたい
 id,  -- typeがnull以外の時だけ、この数のユニークが欲しい
 type,
 ...

こういうのがあった時に、typeに値が入ってる時だけidをカウントしたい、しかもユニークで、という場合、SQLならdistinct とか使います。

select category
          , count(distinct case when type is not null then id end ) as id_count 
          ...
 from table
 group by category

これをpython上で見やすくやろうというのが今回の主旨。

    df.loc[df.type.notnull(), 'id_count'] = df.id

    sum_df = df.groupby('category')\
        .agg({
            'id_count': 'nunique',
            ...
        })\
        .reset_index() 

と出来ます。
ちなみに簡単なmax,minならagg内で取れますし、
ユニークにしなくていいならcountとかも使える。単純に行数だけ撮りたいならlenも使える。

ちなみにmax,min,lenなどはシングルコーテーションで括らなくても使えます。