天天看點

Julia DataFrames ---- 行和列的讀取1 功能概要2 代碼示例

1 功能概要

可以通過多種方式建立DataFrame;如使用CSV,Dict, Rand()函數等。

可以讀取指定行和列。

可以與Matrix等轉換。

使用.=符号指派。

可以添加一列。

按照某一列,對行排序。

2 代碼示例

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)
           

繼續閱讀