我有以下数据框
using DataFrames, Statistics
df = DataFrame(name=["John", "Sally", "Kirk"],
age=[23., 42., 59.],
children=[3,5,2], height = [180, 150, 170])
print(df)
3×4 DataFrame
│ Row │ name │ age │ children │ height │
│ │ String │ Float64 │ Int64 │ Int64 │
├─────┼────────┼─────────┼──────────┼────────┤
│ 1 │ John │ 23.0 │ 3 │ 180 │
│ 2 │ Sally │ 42.0 │ 5 │ 150 │
│ 3 │ Kirk │ 59.0 │ 2 │ 170 │
我可以计算出列的平均值,如下所示:
println(mean(df[:4]))
166.66666666666666
现在,我想获取所有数字列的均值并尝试以下代码:
x = [2,3,4]
for i in x
print(mean(df[:x[i]]))
end
但是收到以下错误消息:
MethodError: no method matching getindex(::Symbol, ::Int64)
Stacktrace:
[1] top-level scope at ./In[64]:3
我该如何解决问题?
答案 0 :(得分:2)
您正尝试使用指定列位置的整数索引来访问DataFrame
的列。您应该只使用在:
之前不带任何i
的整数值,这将创建符号:i
,但是您没有名为i
的列。
x = [2,3,4]
for i in x
println(mean(df[i])) # no need for `x[i]`
end
您还可以使用DataFrame
表示列名来索引Symbol
。
x = [:age, :children, :height];
for c in x
println(mean(df[c]))
end
由于尝试访问符号i
的第:x
个索引,这是未定义的操作,因此在尝试中遇到以下错误。
MethodError: no method matching getindex(::Symbol, ::Int64)
请注意,:4
只是4
。
julia> :4
4
julia> typeof(:4)
Int64
答案 1 :(得分:2)
这里是一个单行代码,实际上选择了所有Number
列:
julia> mean.(eachcol(df[findall(x-> x<:Number, eltypes(df))]))
3-element Array{Float64,1}:
41.333333333333336
3.3333333333333335
166.66666666666666
在许多情况下,describe
实际上更方便:
julia> describe(df)
4×8 DataFrame
│ Row │ variable │ mean │ min │ median │ max │ nunique │ nmissing │ eltype │
│ │ Symbol │ Union… │ Any │ Union… │ Any │ Union… │ Nothing │ DataType │
├─────┼──────────┼─────────┼──────┼────────┼───────┼─────────┼──────────┼──────────┤
│ 1 │ name │ │ John │ │ Sally │ 3 │ │ String │
│ 2 │ age │ 41.3333 │ 23.0 │ 42.0 │ 59.0 │ │ │ Float64 │
│ 3 │ children │ 3.33333 │ 2 │ 3.0 │ 5 │ │ │ Int64 │
│ 4 │ height │ 166.667 │ 150 │ 170.0 │ 180 │ │ │ Int64 │
答案 2 :(得分:0)
在这个问题上,println(mean(df[4]))
也有效(而不是println(mean(df[:4]))
)。
因此我们可以写
x = [2,3,4]
for i in x
println(mean(df[i]))
end
有效