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

时间:2015-02-27 01:50:41

标签: dataframe julia

我正在尝试将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)

2 个答案:

答案 0 :(得分:4)

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

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来创建新向量。然后,您通过将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