代码之家  ›  专栏  ›  技术社区  ›  Mohamed Thasin ah

如何在Julia中读取记录格式json?

  •  1
  • Mohamed Thasin ah  · 技术社区  · 6 年前

    我能够读取json文件,并使用下面的代码将其转换为数据帧。

    df = open(jsontable, "normal.json") |> DataFrame
    

    normal.json 像下面这样,,

    {“col1”:[“thasin”,“hello”,“world”],“col2”:[1,2,3],“col3”:[“abc”,“def”,“ghi”]

    所以最后的df,

    3×3 DataFrame
    │ Row │ col1   │ col2  │ col3   │
    │     │ String │ Int64 │ String │
    ├─────┼────────┼───────┼────────┤
    │ 1   │ thasin │ 1     │ abc    │
    │ 2   │ hello  │ 2     │ def    │
    │ 3   │ world  │ 3     │ ghi    │
    

    但是,同样的代码不适用于 record 格式化的json文件。

    我的示例json

    {"billing_account_id":"0139A","credits":[],"invoice":{"month":"202003"},"cost_type":"regular"}
    {"billing_account_id":"0139A","credits":[1.45],"invoice":{"month":"202003"},"cost_type":"regular"}
    {"billing_account_id":"0139A","credits":[2.00, 3.56],"invoice":{"month":"202003"},"cost_type":"regular"}
    

    预期产出:

      billing_account_id cost_type      credits              invoice
    0             0139A   regular           []  {'month': '202003'}
    1             0139A   regular       [1.45]  {'month': '202003'}
    2             0139A   regular  [2.0, 3.56]  {'month': '202003'}
    

    data = []
    for line in open("sample.json", 'r'):
        data.append(json.loads(line))
    print(data)
    df=pd.DataFrame(data)
    

    朱莉娅怎么做?

    0 回复  |  直到 6 年前
        1
  •  3
  •   Bogumił Kamiński    6 年前

    请注意,您的文件不是有效的JSON(它的行是有效的JSON,而不是整个文件)。

    你可以这样做:

    julia> using DataFrames, JSON3
    
    julia> df = JSON3.read.(eachline("sample.json")) |> DataFrame;
    
    julia> df.credits = Vector{Float64}.(df.credits);
    
    julia> df.invoice = Dict{Symbol,String}.(df.invoice);
    
    julia> df
    3×4 DataFrame
    │ Row │ billing_account_id │ credits                    │ invoice                │ cost_type │
    │     │ String             │ Array{Float64,1}           │ Dict{Symbol,String}    │ String    │
    ├─────┼────────────────────┼────────────────────────────┼────────────────────────┼───────────┤
    │ 1   │ 0139A              │ 0-element Array{Float64,1} │ Dict(:month=>"202003") │ regular   │
    │ 2   │ 0139A              │ [1.45]                     │ Dict(:month=>"202003") │ regular   │
    │ 3   │ 0139A              │ [2.0, 3.56]                │ Dict(:month=>"202003") │ regular   │
    

    上的转换 :credits :invoice 列将使它们成为易于使用的类型(否则它们使用由JSON3.jl内部定义的类型)。

    更高级的选项是通过使用 NamedTuple 类型,例如:

    julia> df = JSON3.read.(eachline("sample.json"),
                            NamedTuple{(:billing_account_id, :credits, :invoice, :cost_type),Tuple{String,Vector{Float64},Dict{String,String},String}}) |>
                DataFrame
    3×4 DataFrame
    │ Row │ billing_account_id │ credits                    │ invoice                 │ cost_type │
    │     │ String             │ Array{Float64,1}           │ Dict{String,String}     │ String    │
    ├─────┼────────────────────┼────────────────────────────┼─────────────────────────┼───────────┤
    │ 1   │ 0139A              │ 0-element Array{Float64,1} │ Dict("month"=>"202003") │ regular   │
    │ 2   │ 0139A              │ [1.45]                     │ Dict("month"=>"202003") │ regular   │
    │ 3   │ 0139A              │ [2.0, 3.56]                │ Dict("month"=>"202003") │ regular   │
    
        2
  •  0
  •   sa-    5 年前

    与julia答案无关,但在python中可以 pd.read_json("sample.json", lines=True)

    推荐文章