DataFrames.jl:如何用combine将数组存入单个单元格?为何元组可行?
DataFrames中combine处理数组与元组的差异问题
测试场景复现
1. 创建初始DataFrame
df = DataFrame(a=[1])
输出结果:
Row │ a │ Int64 ─────┼─────── 1 │ 1
2. 两次combine操作尝试
操作1:生成含数组的新列
combine(df, :a => x->[1,2])
输出结果:
Row │ a_function │ Int64 ─────┼──────────── 1 │ 1 2 │ 2
现象:生成两行,未将整个[1,2]数组存入单个单元格。
操作2:生成含元组的新列
combine(df, :a => x->(1,2))
输出结果:
Row │ a_function │ Tuple… ─────┼──────────── 1 │ (1, 2)
现象:成功将元组存入单个单元格。
疑问解答
1. 数组与元组的处理差异原因
DataFrames的combine函数默认会将可迭代的容器(比如数组)展开为多行数据,这是为了方便用户快速拆分集合数据到不同行;而元组被设计为不可迭代的原子复合类型,不会被自动展开,因此会被完整保留为单个单元格的值。
2. 正确将数组存入单个单元格的方法
要让数组作为整体存入单元格,需要明确阻止combine的展开行为,常用两种方式:
方法1:用元组包裹数组
通过返回包含数组的元组,让函数将其识别为单个值:
combine(df, :a => x->([1,2],))
输出结果:
Row │ a_function │ Vector… ─────┼──────────── 1 │ [1, 2]
方法2:用Ref包装数组(推荐)
Ref会将数组包装为引用类型,避免被迭代展开:
combine(df, :a => x->Ref([1,2]))
同样能得到数组存入单个单元格的结果。
内容的提问来源于stack exchange,提问作者vochicong
相关产品推荐
相关产品推荐

