我正在尝试将 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)
最佳答案
发生这种情况的原因是突变和转换。 如果你有两个向量
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
。
科林·T·鲍尔的回答
df[:A] = float64(df[:A])
所做的是,他没有改变 DataFrame 引用的向量,而是更改引用以引用具有 Flaot64
值的向量。
我希望这是有道理的。
关于dataframe - Julia:将 DataFrame 中的列类型从 Integer 转换为 Float64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28756206/