我有一个数据框。
df_X = pl.DataFrame({'last_name':['James','Warner','Marino','James','Warner','Marino','James'],
'first_name':['Horn','Bro','Kach','Horn','Bro','Kach','Horn'],
'dob':['03/06/1990','09/16/1990','03/06/1990','','03/06/1990','','']}
)
我对最后一个、第一个和 dob 列应用分组以获得计数
df_X.groupby(['last_name','first_name','dob']).agg(pl.count())
在这里我想忽略分组列上的 NULL/EMPTY 值
James Horn 有两个空 DOB,这些不应包含在分组操作中。
这是预期的输出。
当然,我们可以在进行分组之前对列进行过滤,如下所示
df_X.filter(pl.col('dob')!="").groupby(['last_name','first_name','dob']).agg(pl.count())
但是如果我在过滤操作中要指定 10 列怎么办?我需要一个接一个地写它们。
还有其他解决办法吗?
首先用
null
值替换空字符串,然后使用 drop_nulls
(
df_X
.with_columns(
pl.when(pl.col(group_columns).str.len_chars() == 0)
.then(None)
.othrwise(pl.col(group_columns))
.name.keep()
)
.drop_nulls(group_columns)
.group_by(group_columns)
.len()
)
shape: (4, 4)
┌───────────┬────────────┬────────────┬───────┐
│ last_name ┆ first_name ┆ dob ┆ len │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ str ┆ str ┆ u32 │
╞═══════════╪════════════╪════════════╪═══════╡
│ Warner ┆ Bro ┆ 09/16/1990 ┆ 1 │
│ Marino ┆ Kach ┆ 03/06/1990 ┆ 1 │
│ Warner ┆ Bro ┆ 03/06/1990 ┆ 1 │
│ James ┆ Horn ┆ 03/06/1990 ┆ 1 │
└───────────┴────────────┴────────────┴───────┘