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上で見やすくやろうというのが今回の主旨。
と出来ます。
ちなみに簡単なmax,minならagg内で取れますし、
ユニークにしなくていいならcountとかも使える。単純に行数だけ撮りたいならlenも使える。
ちなみにmax,min,lenなどはシングルコーテーションで括らなくても使えます。
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などはシングルコーテーションで括らなくても使えます。
コメント