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
现在x
和a
指的是同一个向量[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 将 Float64
值 5.0
转换为 Int
值 5
。如果你试过
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
值的向量。
我希望这是有道理的。
我正在尝试将 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
现在x
和a
指的是同一个向量[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 将 Float64
值 5.0
转换为 Int
值 5
。如果你试过
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
值的向量。
我希望这是有道理的。