web-dev-qa-db-ja.com

Julia(バージョン0.3)DataFrameの複数の列名をどのように変更しますか?

たとえば、20列のJuliaDataFrameを次のように作成するとします。

y=convert(DataFrame, randn(10,20))

列名(:x1 ... :x20)(:col1, ..., :col20)などの別の名前に一度に変換するにはどうすればよいですか?

17
John St. John

names!関数がより簡潔になる場合があります。

Julia> using DataFrames

Julia> df = DataFrame(x1 = 1:2, x2 = 2:3, x3 = 3:4)
2x3 DataFrame
|-------|----|----|----|
| Row # | x1 | x2 | x3 |
| 1     | 1  | 2  | 3  |
| 2     | 2  | 3  | 4  |

Julia> names!(df, [symbol("col$i") for i in 1:3])
Index([:col2=>2,:col1=>1,:col3=>3],[:col1,:col2,:col3])

Julia> df
2x3 DataFrame
|-------|------|------|------|
| Row # | col1 | col2 | col3 |
| 1     | 1    | 2    | 3    |
| 2     | 2    | 3    | 4    |
24

これを行う1つの方法は、rename!関数を使用することです。名前変更関数のメソッドは、入力としてDataFrameを取りますが、一度に変更できるのは1つの列名のみです(2014年1月4日の開発バージョン0.3ブランチ以降)。 DataFramesリポジトリのIndex.jlのコードを調べると、私に役立つこのソリューションが見つかります。

rename!(y.colindex, [(symbol("x$i")=>symbol("col$i")) for i in 1:20])

y.colindexはデータフレームyのインデックスを返し、次の引数は古い列シンボルを新しい列シンボルにマッピングするディクショナリを作成します。他の誰かがこれを必要とするときまでに、これを行うためのより良い方法があると思いますが、私はジュリアの開発バージョン0.3でこれを理解するのに数時間を費やしたので、共有したいと思いました!

6
John St. John

@JohnMylesWhiteの回答の更新として、names!関数はDataFrames v 0.20.2で非推奨になりました。これを実行する最新の方法は、rename!関数を使用することです。

import DataFrames
DF = DataFrames

df = DF.DataFrame(x1 = 1:2, x2 = 2:3, x3 = 3:4)
println(df)
DF.rename!(df, [Symbol("Col$i") for i in 1:size(df,2)])
println(df)
2
SeSodesa

Update:Julia 0.4の場合、John Myles Whiteが説明しているように、すべての名前は次のように変更できます。

names!(df::AbstractDataFrame, vals)

ここで、valsは、dfの列数と同じ長さのVector {Symbol}です。

特定の名前は次の方法で変更できます。

rename!(df::AbstractDataFrame, from::Symbol, to::Symbol)
rename!(df::AbstractDataFrame, d::Associative)
rename!(f::Function, df::AbstractDataFrame)

ここで、dは元の名前を新しい名前にマップする連想型であり、fは古い列名(シンボル)を入力として、新しい列名(シンボル)を持つ関数です。出力として。

これは、次のコードに記載されています https://github.com/JuliaStats/DataFrames.jl/blob/7e2f48ad9f31185d279fdd81d6413a79b7e42e87/src/abstractdataframe/abstractdataframe.jl

2
ultradian

v1.1.

列名は次の方法で直接変更できます。

names!(df, colNames_as_Symbols)

文字列のベクトルで列の名前を変更するには、次の方法で実行できます。

names!(df, Symbol.(colNames_as_strings) ) 
2
Cliff AB

これは、Julia1.1.1の短くて簡単な答えです。

names!(df, [Symbol("Col$i") for i in 1:size(df,2)])
0
srgk26

Johnのデータフレームを使用して、colnames!の代わりにnames!を使用する必要がありました

df = DataFrame(x1 = 1:2, x2 = 2:3, x3 = 3:4)
colnames!(df, ["col$i" for i in 1:3])

ジュリアの私のバージョンは0.2.1です

0
Guillaume G