可以通过多种方式创建DataFrame;如使用CSV,Dict, Rand()函数等。
可以读取指定行和列。
可以与Matrix等转换。
使用.=符号赋值。
可以添加一列。
按照某一列,对行排序。
using DataFrames, CSV, Statistics,Tables
using Random
using BenchmarkTools
# 創建DataFrame方式
#通過讀取CSV文件
iris = DataFrame(CSV.File(joinpath(dirname(pathof(DataFrames)),
"C:/D/Julia/DataFrames/DataFrames.jl/docs/src/assets/iris.csv")));
permutedims([1, 2, 3])
#通過字典Dick
x = Dict("A" => [1,2], "B" => [true, false], "C" => ['a', 'b'])
DataFrame(x)
# rand(3)指定每個DataFrameColum值 ,for i in 1:3]指定列
rand(3) #是一個一維的Vector,三行一列的矩陣
DataFrame([rand(3)]) #三行一列的DataFrame
rand(3,4) #三行4列的矩陣 Array
DataFrame(rand(3,4)) #三行四列的DataFrame
DataFrame([rand(3) for i in 1:3]) #三行三列的DataFrame
#是一行三列的矩陣 Array
permutedims([1, 2, 3])
DataFrame(permutedims([1, 2, 3])) #一行 三列的DataFrame
y = DataFrame(rand(1:10, 100, 10); makeunique=true)
#避免重複的列名,如果 makeunique=false 就會報錯
df = DataFrame(:a=>1, :a=>2, :a_1=>3; makeunique=true)
#指定列名,行和列的數目要相等
x = DataFrame(x=1:2, y=["A", "B"])
# 與其他數據類型的轉換
Matrix(x)
Tables.columntable(x)
vecs = collect(eachcol(iris, true)) #每一行轉爲Vector,一維的矩陣
show(vecs)
# 根據列名 輸出
for name in names(iris)
show(iris[!,name])
end
#比較
y = DataFrame!(x)
(x === y), isequal(x, y)
similar(x)
x = DataFrame(a=1:2, b='a':'b')
# 指定的行範圍;和列名的模糊匹配
df = DataFrame(:a=>1, :a=>2, :a_1=>3; makeunique=true)
y = DataFrame(rand(1:10, 100, 10); makeunique=false)
y[Not(2:5), r"x2"] #排除指定行
y[2:5, [:x1,:x3]] #取指定行 和指定列
y[2:5, Between(:x1,:x3)] #取指定行 和指定範圍列
y[!, r"x2"] #取所有行
y[!, Not(r"x2")] #排除指定列
y[:, All(:x1, Between(:x2, :x4))] #取所有行和指定範圍列
@view y[!, Not(r"x2")] # @view 宏定義 返回的是SubDataFrame,前面都是DataFrame
select(df, [1, 2])
select(df, Not([1, 2]))
hasproperty(x, :x1) #列名是否存在
columnindex(x, :x2) #列名的序列值
#賦值操作,注意行數和列數要對應的上
y[1:2, 1:2] .= 1
y[1:2, 1:2] .= [1,2]
y[1:2, 1:2] .= DataFrame([5 6; 7 8], [:x1, :x2]) #其中[:x1, :x2]必須是y中實際存在的列名
# 按列進行拆分,每一列為 DataFrameColums
eachcol(iris, true)
#列名重命名
x = DataFrame(rand(Int8, 3, 4))
rename(x, :x1 => :A)
Random.seed!(1234)
x[:, shuffle(names(x))]
select!(x, 4:-1:1);
@btime x[:, [1,3]]
#合并两个DataFrame,要求每个DataFrame的列名唯一,即makeunique=true,同时要求两个DataFrame的行数要一致,列可以不同。
x = DataFrame([(i,j) for i in 1:3, j in 1:4])
y = DataFrame([(i,j) for i in 1:3, j in 1:5])
hcat(x, y, makeunique=true)
#添加一列,
@btime [$x[!, 1:2] DataFrame(A=[1,2,3]) $x[!, 3:4]]
insertcols!(y, 2, newcol=[1,2,3]) #添加中间某一列
insertcols!(y, 1, newcol=[1,2,3], makeunique=true) #添加到第一列
@btime insertcols!(copy($x), 3, :A => [1,2,3]) #添加中间某一列
insertcols!(x, ncol(x)+1, A=[1,2,3]) #添加到最后一列
#查看指定行和列
view(x, 5:7, :)
#删除指定的行
deleterows!(x, 3:6)
#行排序
x = DataFrame(id=1:12, x = rand(12), y = [zeros(6); ones(6)])
issorted(x), issorted(x, :x) #检查是否排序
sort!(x, :x)
sort(x, (:y, :x), rev=(true, false)) # y降序,x升序
shuffle(1:10)