Julia DataFrame索引操作中符号:与!的区别是什么
Julia DataFrame 中
:与!行索引的区别 这两种索引返回值看起来一致是因为内容完全相同,核心差异体现在返回对象是否和原DataFrame的列共享内存,具体区别如下:
df[:, 列索引]返回列的拷贝
对返回的向量做任何修改,都不会影响原DataFrame中的对应列,示例:
作为左值赋值时,df = DataFrame(Data1 = rand(5), Data2 = rand(5)); col_copy = df[:, 1] col_copy[1] = 999 println(df[1, 1]) # 输出还是原来的随机值,不会变成999df[:, 1] = 新向量会把新向量的内容逐元素拷贝到现有列中,要求新向量长度和原有列完全匹配,不会变更DataFrame内部的列绑定关系。df[!, 列索引]返回列的直接引用
返回的向量和DataFrame内部存储的列是同一个对象,修改返回向量会同步修改原DataFrame的内容,示例:
作为左值赋值时,df = DataFrame(Data1 = rand(5), Data2 = rand(5)); col_ref = df[!, 1] col_ref[1] = 999 println(df[1, 1]) # 输出会变成999,原DataFrame已被修改df[!, 1] = 新向量会直接把DataFrame的对应列替换为新向量本身,相当于重新绑定该列的存储对象,只要新向量长度符合要求即可。
场景选择建议
- 若需要避免误改原DataFrame,或者需要对返回列做独立修改,选择
:索引 - 若只是读取列数据做计算,或者明确需要修改原DataFrame的列,选择
!索引,无需额外拷贝内存,性能更高
内容的提问来源于stack exchange,提问作者AfterFray
相关产品推荐
相关产品推荐

