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

Julia: converting column type from Integer to Float64 in a DataFrame

我正在尝试将 DataFrame 列中的数字类型从整数更改为浮点数。这样做应该很简单,但它不起作用。数据类型仍然是整数。我错过了什么?

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)

试试这个:

df[:A] = float64(df[:A])

这对我适用于 Julia v0.3.5 和 DataFrames v0.6.1。

虽然这很有趣。请注意:

df[:, :A] = [2.0, 2.0, 3.0, 4.0]

会将列的内容更改为 [2,2,3,4],但将类型保留为 Int64,而

df[:A] = [2.0, 2.0, 3.0, 4.0]

也会改变类型。

我只是快速浏览了一下手册,没有看到任何关于此行为的参考(诚然,这是一个非常快速的浏览)。但我发现这不够直观,也许值得 filing an issue

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

a = [1:3]
b = [4:6]

你可以让 x 通过赋值引用其中之一。

x = a

现在xa指的是同一个向量[1, 2, 3]。如果您随后将 b 分配给 x

x = b

您现在已将 x 更改为引用与 b 相同的向量。

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

x[:] = a

您将向量 a 中的值复制到向量 b,所以现在您有两个向量 [1, 2, 3]

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

x[1] = 5.0

这为您提供了向量 [5, 2, 3],因为 Julia 将 Float645.0 转换为 Int5。如果你试过

x[1] = 5.5

Julia 将抛出一个 InexactError() 因为 5.5 不能无损地转换为整数。

当谈到 DataFrame 时,只要您意识到 DataFrame 是对向量的命名引用的集合,事情就一样了。那么在这个调用中构建 DataFrame 时你在做什么

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

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

稍后再做

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

您首先通过将向量 [1, 2, 3, 4] 中的值转换为 Float64 来创建一个新向量。然后,您通过将 Float64 向量中的值复制回 Int 向量来改变 df[:A] 引用的向量,这会导致 Julia 将值转换回 Int .

Colin T Bower 的回答是什么

df[:A] = float64(df[:A])

的作用是,他没有改变 DataFrame 引用的向量,而是更改引用以引用具有 Flaot64 值的向量。

我希望这是有道理的。