从维度中过滤空值:CSV缺失值下按总运行时长分组流派的问题
解决流派维度空值过滤与总运行时长分组问题
首先,先把你的示例CSV数据整理出来(修正了末尾多余的数值):
runtime,genres,production_companies,release_date 105,Action|Comedy|Science Fiction,Columbia Pictures|Happy Madison Productions,7/16/15 105,,Columbia Pictures|Happy Madison Productions,7/16/15
你当前代码里的filter(!"")写法不太正确,而且当genres是空字符串时,split("|")会得到[""]这个包含空字符串的数组,这会导致分组里出现无效的空流派条目。咱们可以通过以下两种方式来解决这个问题:
方式一:在维度访问器中处理空值
直接在维度的访问器函数里判断并过滤空的流派值,这样无效数据不会被计入任何分组:
// 定义支持多值的流派维度,同时过滤空值 var genres = data.dimension(function(d) { // 如果genres为空或仅含空白字符,返回空数组,不参与分组 if (!d.genres || d.genres.trim() === "") { return []; } // 拆分流派后,再过滤掉可能存在的空字符串(比如字段末尾多了|的情况) return d.genres.split("|").filter(genre => genre.trim() !== ""); }, true); // 第二个参数true启用多值维度,让每个流派单独成为维度项 // 按流派分组,计算该流派的总运行时长 var group = genres.group().reduceSum(function(d) { return d.runtime; // 返回runtime字段进行求和计算 });
方式二:先过滤数据集再创建维度
如果你的需求是完全排除没有流派的条目(不让这些数据参与任何统计),可以先过滤整个数据集:
// 先过滤掉genres为空的所有数据 var filteredData = data.filter(function(d) { return d.genres && d.genres.trim() !== ""; }); // 基于过滤后的数据集创建维度 var genres = filteredData.dimension(function(d) { return d.genres.split("|").filter(genre => genre.trim() !== ""); }, true); // 分组计算总运行时长 var group = genres.group().reduceSum(function(d) { return d.runtime; });
关键说明
- 多值维度支持:第二个参数
true是必须的,它告诉dc.js这个维度的每个条目可以对应多个值(也就是拆分后的多个流派),这样才能实现按每个唯一流派分组统计。 - 严格空值过滤:用
trim()是为了避免字段里只有空格的情况,确保真正的空值才会被过滤掉。
内容的提问来源于stack exchange,提问作者user1863237
相关产品推荐
相关产品推荐

