我正在尝试将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)
答案 0 :(得分:4)
发生这种情况的原因是变异和转换。 如果你有两个向量
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
来创建新向量。然后,您通过将df[:A]
向量中的值复制回Float64
向量,使Int
向量转换为Int
,从而改变了df[:A] = float64(df[:A])
引用的向量。 。
Colin T Bower的回答
Flaot64
确实不是改变DataFrame引用的向量,而是更改引用以引用具有{{1}}值的向量。
我希望这是有道理的。
答案 1 :(得分:1)
试试这个:
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。