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

7

我试图将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)

格式化您的代码 - udondan
1
@DanielSchroeder 完成了!对此很抱歉。 - Pooya
我已经更新了我的回答,并建议您考虑提交一个问题。您指出的行为对我来说非常不直观(尽管可能有很好的理由)。 - Colin T Bowers
刚刚提交了一个问题。谢谢! - Pooya
2个回答

7
这种情况发生的原因是变异和转换。如果您有两个向量:
a = [1:3]
b = [4:6]

你可以通过赋值将x指向它们中的一个。

x = a

现在,xa指向相同的向量[1, 2, 3]。如果你将b赋值给x,那么xb也会指向同一个向量。
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

由于5.5无法精确转换为整数,Julia将抛出一个InexactError()错误。

在处理DataFrames时,只要你意识到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。请注意保留HTML标记。以下是Colin T Bower的答案。
df[:A] = float64(df[:A])

这里的意思是,他并没有改变DataFrame所引用的向量本身,而是将引用指向一个包含Float64值的向量。

希望这样更容易理解。


太棒了!谢谢你的答案。 - Pooya
2
这在Julia 0.6(以及之前的版本)中已经不再适用,因为构造函数不再在类型之间进行转换。我找到的唯一解决方案是显式地使用convert函数:df[:A] = convert(DataArrays.DataArray{Float64,1},df[:A]) - Antonello

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]

这也会改变类型。

我只是快速查看了一下手册,没有看到任何关于这种行为的参考(尽管这只是一个非常快速的查看)。但我发现这个不太直观,也许值得提交问题


太好了,我也可以用。奇怪的是前者不起作用! - Pooya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接