DataFrames读取Excel文件后,float类型被识别成了string类型,如何解决?

using DataFrames
import XLSX

df = DataFrame(XLSX.readtable(“fdjsp.xlsx”, “KC.GEFDJSP”)…)
df.值[1:5]
然后输出下面的:
5-element Vector{Any}:
“1929.846”
“1548.884”
“1066.629”
“1299.528”
“1405.254”
怎么能直接读成float类型的df?还是需要再单独转换一次?怎么操作?谢谢 :kissing_heart:

现在我是拿for循环一个一个改的,可以实现,但有没有什么更高效的方式?

发现把文件改成csv格式后,读取时可以自动正确识别数据类型,但是excel文件不行。

参考DataFrames.jl的文档,可以用identity.()函数。
https://dataframes.juliadata.org/stable/man/importing_and_exporting/

以下是文档中的例子

julia> using DelimitedFiles, DataFrames

julia> data, header = readdlm(joinpath(dirname(pathof(DataFrames)),
                                       "..", "docs", "src", "assets", "iris.csv"),
                              ',', header=true);

julia> iris_raw = DataFrame(data, vec(header))
150×5 DataFrame
 Row │ SepalLength  SepalWidth  PetalLength  PetalWidth  Species
     │ Any          Any         Any          Any         Any
─────┼──────────────────────────────────────────────────────────────────
   1 │ 5.1          3.5         1.4          0.2         Iris-setosa
   2 │ 4.9          3.0         1.4          0.2         Iris-setosa
   3 │ 4.7          3.2         1.3          0.2         Iris-setosa
   4 │ 4.6          3.1         1.5          0.2         Iris-setosa
   5 │ 5.0          3.6         1.4          0.2         Iris-setosa
   6 │ 5.4          3.9         1.7          0.4         Iris-setosa
   7 │ 4.6          3.4         1.4          0.3         Iris-setosa
   8 │ 5.0          3.4         1.5          0.2         Iris-setosa
  ⋮  │      ⋮           ⋮            ⋮           ⋮             ⋮
 144 │ 6.8          3.2         5.9          2.3         Iris-virginica
 145 │ 6.7          3.3         5.7          2.5         Iris-virginica
 146 │ 6.7          3.0         5.2          2.3         Iris-virginica
 147 │ 6.3          2.5         5.0          1.9         Iris-virginica
 148 │ 6.5          3.0         5.2          2.0         Iris-virginica
 149 │ 6.2          3.4         5.4          2.3         Iris-virginica
 150 │ 5.9          3.0         5.1          1.8         Iris-virginica
                                                        135 rows omitted

julia> iris = identity.(iris_raw)
150×5 DataFrame
 Row │ SepalLength  SepalWidth  PetalLength  PetalWidth  Species
     │ Float64      Float64     Float64      Float64     SubStrin…
─────┼──────────────────────────────────────────────────────────────────
   1 │         5.1         3.5          1.4         0.2  Iris-setosa
   2 │         4.9         3.0          1.4         0.2  Iris-setosa
   3 │         4.7         3.2          1.3         0.2  Iris-setosa
   4 │         4.6         3.1          1.5         0.2  Iris-setosa
   5 │         5.0         3.6          1.4         0.2  Iris-setosa
   6 │         5.4         3.9          1.7         0.4  Iris-setosa
   7 │         4.6         3.4          1.4         0.3  Iris-setosa
   8 │         5.0         3.4          1.5         0.2  Iris-setosa
  ⋮  │      ⋮           ⋮            ⋮           ⋮             ⋮
 144 │         6.8         3.2          5.9         2.3  Iris-virginica
 145 │         6.7         3.3          5.7         2.5  Iris-virginica
 146 │         6.7         3.0          5.2         2.3  Iris-virginica
 147 │         6.3         2.5          5.0         1.9  Iris-virginica
 148 │         6.5         3.0          5.2         2.0  Iris-virginica
 149 │         6.2         3.4          5.4         2.3  Iris-virginica
 150 │         5.9         3.0          5.1         1.8  Iris-virginica
                                                        135 rows omitted
1 个赞

这个好像是把未认定数据类型的数据,自动识别并添加类型。对于我这种数据类型识别错误的好像不行。

可是你例子里面的类型确实是Any。

你这个的数据本来就是 String,因为你的数据含有中文的引号。“1929.846”"1929.846" 不一样,后者可以用 x-> parse(Float64,x) 解决,你这个得先处理 字符串。

1 个赞

这个数据从xlsx里读出来就是string类型,但是我把xlsx转存成csv后,从csv中读就是float。是xlsx里能直接确定数据类型吗?

这个数据从xlsx里读出来就是string类型,但是我把xlsx转存成csv后,从csv中读就是float。是xlsx里能直接确定数据类型吗?
image
原表格是这样的。

说明你的excel表里面这一列是以文本形式保存的。
一般从表格读取的时候,我都喜欢转换成csv来读取

x-> parse(Float64,x),这个方法在DataFrames中有批量方法吗?

df[!,:a]=map(x->parse(Float64,x), df[!,:a])

就这样,用 map 批量化。