julia创建一个空数据框并向其追加行

can*_*his 28 dataframe julia

我正在尝试Julia DataFrames模块.我对它很感兴趣所以我可以用它在Gadfly中绘制简单的模拟.我希望能够迭代地向数据帧添加行,我想将其初始化为空.

有关如何执行此操作的教程/文档很少(大多数文档描述了如何分析导入的数据).

附加到非空数据帧很简单:

df = DataFrame(A = [1, 2], B = [4, 5])
push!(df, [3 6])
Run Code Online (Sandbox Code Playgroud)

这回来了.

3x2 DataFrame
| Row | A | B |
|-----|---|---|
| 1   | 1 | 4 |
| 2   | 2 | 5 |
| 3   | 3 | 6 |
Run Code Online (Sandbox Code Playgroud)

但是对于一个空的init我会得到错误.

df = DataFrame(A = [], B = [])
push!(df, [3, 6])
Run Code Online (Sandbox Code Playgroud)

错误信息:

ArgumentError("Error adding 3 to column :A. Possible type mis-match.")
while loading In[220], in expression starting on line 2
Run Code Online (Sandbox Code Playgroud)

初始化空Julia DataFrame的最佳方法是什么,以便您可以稍后在for循环中迭代添加项目?

waT*_*eim 29

仅使用[]定义的零长度数组将缺少足够的类型信息.

julia> typeof([])
Array{None,1}
Run Code Online (Sandbox Code Playgroud)

所以要避免这个问题就是简单地指出类型.

julia> typeof(Int64[])
Array{Int64,1}
Run Code Online (Sandbox Code Playgroud)

您可以将其应用于您的DataFrame问题

julia> df = DataFrame(A = Int64[], B = Int64[])
0x2 DataFrame

julia> push!(df, [3  6])

julia> df
1x2 DataFrame
| Row | A | B |
|-----|---|---|
| 1   | 3 | 6 |
Run Code Online (Sandbox Code Playgroud)

  • 那么你知道DataFrame会有多大的情况怎么样?预先初始化它是否更有效?例如`DataFrame(Int64,1000,10)`那么在迭代时填充每一行的语法是什么? (12认同)

wue*_*eli 5

@waTeim 的答案已经回答了最初的问题。但是如果我想动态创建一个空DataFrame并向其追加行怎么办?例如,如果我不想要硬编码的列名怎么办?

\n

在这种情况下,df = DataFrame(A = Int64[], B = Int64[])这是不够的。\nNamedTuple A = Int64[], B = Int64[]需要动态创建。

\n

假设我们有一个列名称向量col_names和一个列类型向量colum_types,可以从中创建一个空的DataFrame.

\n
col_names = [:A, :B] # needs to be a vector Symbols\ncol_types = [Int64, Float64]\n# Create a NamedTuple (A=Int64[], ....) by doing\nnamed_tuple = (; zip(col_names, type[] for type in col_types )...)\n\ndf = DataFrame(named_tuple) # 0\xc3\x972 DataFrame\n
Run Code Online (Sandbox Code Playgroud)\n

或者,NameTuple可以使用以下命令创建

\n
# or by doing\nnamed_tuple = NamedTuple{Tuple(col_names)}(type[] for type in col_types )\n
Run Code Online (Sandbox Code Playgroud)\n