如何在Polars DataFrame的列表列中过滤空字符串并统计非空元素数
统计Polars列表列中非空字符串的数量
给定如下Polars DataFrame:
import polars as pl pl.Config(fmt_table_cell_list_len=8, fmt_str_lengths=80) df = pl.DataFrame({'test_names':[['Mallesham','','Bhavik','Jagarini','Jose','Fernando'], ['','','','ABC','','XYZ']]})
直接使用list.len()统计列表长度会把空字符串计入结果,无法满足需求:
df.with_columns(pl.col('test_names').list.len().alias('tot_names'))
解决方案
要过滤空字符串后统计数量,可采用以下几种高效实现方式:
方法1:list.filter + list.len
先过滤掉空字符串,再统计剩余元素的长度:
result = df.with_columns( pl.col('test_names').list.filter(lambda x: x != '').list.len().alias('tot_names') )
方法2:list.eval 结合过滤与计数
通过list.eval在列表内部执行过滤和计数操作:
result = df.with_columns( pl.col('test_names').list.eval(pl.element().filter(pl.element() != '').count()).alias('tot_names') )
方法3:布尔值求和
利用空字符串转为False、非空字符串转为True的特性,求和得到非空元素数量:
result = df.with_columns( pl.col('test_names').list.map_elements(lambda lst: sum(item != '' for item in lst)).alias('tot_names') )
最终输出
以上方法均可得到预期结果:
┌─────────────────────────────────────────────────────────────┬───────────┐ │ test_names ┆ tot_names │ │ --- ┆ --- │ │ list[str] ┆ u32 │ ╞═════════════════════════════════════════════════════════════╪═══════════╡ │ ["Mallesham", "", "Bhavik", "Jagarini", "Jose", "Fernando"] ┆ 5 │ │ ["", "", "", "ABC", "", "XYZ"] ┆ 2 │ └─────────────────────────────────────────────────────────────┴───────────┘
内容的提问来源于stack exchange,提问作者myamulla_ciencia
相关产品推荐
相关产品推荐

