Julia中如何在combine操作内使用nrow创建新列
在DataFrames的combine操作内计算metric_per_frequency指标
你已经完成了topics列拆分、分组统计,但需要在combine内部直接生成metric_per_frequency(即sum_metric除以frequency_topics),不需要额外后续步骤,也不想用速度较慢的@by宏。
修改后的可行代码
方法1:基于多列映射的方式
topics = ["Money,Income,Lifestyle","Knowledge,Windows,Weather","Vaccation,Holiday,Money,Weather"] metric = [2347820, 1275610, 1255383] table = DataFrame(topics=topics, metric=metric) agg_table = combine( groupby( # 修复拆分逻辑:避免空字符串,直接返回拆分后的数组 flatten(transform(table, :topics => ByRow(x -> ismissing(x) ? [] : split(x, ",")) => :topics), :topics), :topics ), nrow => :frequency_topics, :metric => sum => :sum_metric, # 利用已计算的两列,通过匿名函数计算比值 [:sum_metric, :frequency_topics] => (s, f) -> s ./ f => :metric_per_frequency )
方法2:使用do块一次性计算所有指标(效率更高)
agg_table = combine(groupby(flatten(transform(table, :topics => ByRow(x -> ismissing(x) ? [] : split(x, ",")) => :topics), :topics), :topics)) do g freq = nrow(g) sum_m = sum(g.metric) DataFrame( frequency_topics = freq, sum_metric = sum_m, metric_per_frequency = sum_m / freq ) end
输出结果
Row │ topics sum_metric frequency_topics metric_per_frequency │ String Int64 Int64 Float64 ─────┼─────────────────────────────────────────────────────────────── 1 │ Money 3603203 2 1.8016015e6 2 │ Income 2347820 1 2.34782e6 3 │ Lifestyle 2347820 1 2.34782e6 4 │ Knowledge 1275610 1 1.27561e6 5 │ Windows 1275610 1 1.27561e6 6 │ Weather 2530993 2 1.2654965e6 7 │ Vaccation 1255383 1 1.255383e6 8 │ Holiday 1255383 1 1.255383e6
关键说明
- 方法1中,
combine支持以多列数组作为输入([:sum_metric, :frequency_topics]),通过匿名函数接收对应列的计算结果,完成比值计算。 - 方法2的do块模式直接操作每个分组的子DataFrame,只需遍历一次分组即可计算所有指标,在数据量较大时效率更优。
- 原拆分逻辑中修复了空字符串的问题:当
x为空时返回空数组而非空字符串,避免生成无效的空topic行。
内容的提问来源于stack exchange,提问作者Aku
相关产品推荐
相关产品推荐

