Julia:在DataFrame中将列类型从Integer转换为Float64

Poo*_*oya 4 dataframe julia

I am trying to change type of numbers in a column of a DataFrame from integer to floating point. It should be straightforward to do this, but it's not working. The data type remains to be integer. What am I missing?

In  [2]: using DataFrames
df = DataFrame(A = 1:4, B = ["M", "F", "F", "M"])

Out [2]: 4x2 DataFrame
| Row | A | B   |
|-----|---|-----|
| 1   | 1 | "M" |
| 2   | 2 | "F" |
| 3   | 3 | "F" |
| 4   | 4 | "M" |

In  [3]: df[:,:A] = float64(df[:,:A])

Out [3]: 4-element DataArray{Float64,1}:
 1.0
 2.0
 3.0
 4.0

In  [4]: df

Out [4]: 4x2 DataFrame
| Row | A | B   |
|-----|---|-----|
| 1   | 1 | "M" |
| 2   | 2 | "F" |
| 3   | 3 | "F" |
| 4   | 4 | "M" |

In  [5]: typeof(df[:,:A])

Out [5]: DataArray{Int64,1} (constructor with 1 method)
Run Code Online (Sandbox Code Playgroud)

Mr *_*pha 5

发生这种情况的原因是突变和转化。如果你有两个向量

a = [1:3]
b = [4:6]
Run Code Online (Sandbox Code Playgroud)

您可以x参考其中之一进行分配。

x = a
Run Code Online (Sandbox Code Playgroud)

现在,xa引用相同的向量[1, 2, 3]。如果您然后分配bx

x = b
Run Code Online (Sandbox Code Playgroud)

您现在已更改x为指向与所指代相同的向量b

您还可以通过将一个向量中的值复制到另一个向量来对向量进行突变。如果你这样做

x[:] = a
Run Code Online (Sandbox Code Playgroud)

您将vector中的值复制a到vector上b,因此现在有了两个vector [1, 2, 3]

然后还有转换。如果将一种类型的值复制到另一种值的向量中,Julia将尝试将该值转换为元素向量的值。

x[1] = 5.0
Run Code Online (Sandbox Code Playgroud)

这给您一个向量,[5, 2, 3]因为Julia将Float64值转换5.0Intvalue 5。如果你尝试过

x[1] = 5.5
Run Code Online (Sandbox Code Playgroud)

Julia会抛出a,InexactError()因为5.5无法将其无损地转换为整数。

关于DataFrames,只要您意识到DataFrame是向量的命名引用的集合,它们的工作原理相同。所以在此调用中构造DataFrame时您正在做什么

df = DataFrame(A = 1:4, B = ["M", "F", "F", "M"])
Run Code Online (Sandbox Code Playgroud)

是您创建矢量[1, 2, 3, 4],以及矢量["M", "F", "F", "M"]。然后,使用对这两个新向量的引用构造一个DataFrame。

以后当你做

df[:,:A] = float64(df[:,:A])
Run Code Online (Sandbox Code Playgroud)

首先由矢量的值转换为创建一个新的载体[1, 2, 3, 4]进入Float64。然后,df[:A]通过将Float64向量中的值复制回向量中来对所引用的向量进行变异Int,这将导致Julia将值转换回Int

科林·T·鲍尔的答案是什么

df[:A] = float64(df[:A])
Run Code Online (Sandbox Code Playgroud)

他所做的是,他没有更改DataFrame引用的向量,而是更改了引用以引用具有Flaot64值的向量。

我希望这是有道理的。

  • 这不再适用于 Julia 0.6(可能还有之前的版本),因为构造函数不再在类型之间进行转换。我发现的唯一解决方案是显式使用“convert”函数:“df[:A] = Convert(DataArrays.DataArray{Float64,1},df[:A])” (2认同)