カラムの欠損値でグルーピング
テーブルにN個のカラムがあり、
それぞれに欠損値が入っている時に、
その欠損値の入り方によって、データをグルーピングして認識したい時がある N個のカラムがある時、最大で$ 2^N個のグルーピングができうる
Polarsで書くと以下の通り
code:py
import polars as pl
def group_by_binary_combinations(df):
df_binary = (
df
.select(
[pl
.when(pl.col(c).is_null())
.then(0)
.otherwise(1)
.alias(c) for c in df.columns
]
)
)
return (
df
.with_columns(
df_binary.select(pl.concat_str(pl.all()).alias("group"))
)
.group_by("group")
.agg([
pl.count(),
pl.all().first()
])
.sort("count", descending=True)
)
例
code:py
df = pl.DataFrame({
})
print(group_by_binary_combinations(df))
code:dummy table
┌──────┬──────┬──────┬──────┬──────┐
│ col1 ┆ col2 ┆ col3 ┆ col4 ┆ col5 │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 ┆ i64 ┆ i64 │
╞══════╪══════╪══════╪══════╪══════╡
│ 1 ┆ null ┆ 1 ┆ null ┆ null │
│ null ┆ 2 ┆ null ┆ 2 ┆ null │
│ 3 ┆ 3 ┆ null ┆ null ┆ 3 │
│ 4 ┆ null ┆ 4 ┆ null ┆ null │
│ null ┆ null ┆ null ┆ null ┆ null │
└──────┴──────┴──────┴──────┴──────┘
code:result
┌───────┬──────┬──────┬──────┬──────┬──────┬───────┐
│ group ┆ col1 ┆ col2 ┆ col3 ┆ col4 ┆ col5 ┆ count │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ i64 ┆ i64 ┆ i64 ┆ i64 ┆ i64 ┆ u32 │
╞═══════╪══════╪══════╪══════╪══════╪══════╪═══════╡
│ 10100 ┆ 1 ┆ null ┆ 1 ┆ null ┆ null ┆ 2 │
│ 00000 ┆ null ┆ null ┆ null ┆ null ┆ null ┆ 1 │
│ 11001 ┆ 3 ┆ 3 ┆ null ┆ null ┆ 3 ┆ 1 │
│ 01010 ┆ null ┆ 2 ┆ null ┆ 2 ┆ null ┆ 1 │
└───────┴──────┴──────┴──────┴──────┴──────┴───────┘
groupbyで集約されるが、サンプルとして1行取得して表示している