【问题标题】:Json to CSV issuesJson 到 CSV 问题
【发布时间】:2020-06-25 17:30:30
【问题描述】:

我正在使用 pandas 来规范化一些 json 数据。当超过 1 个部分是对象或数组时,我就陷入了这个问题。

如果我在 Car 上使用 record_path,它会在第二个中断。

关于如何获得这样的东西以在每个汽车和每个位置的 csv 中创建一条线的任何指示?

[
    {
        "Name": "John Doe",
        "Car": [
            "Car1",
            "Car2"
        ],
        "Location": "Texas"
    },
    {
        "Name": "Jane Roe",
        "Car": "Car1",            
        "Location": [
            "Illinois",
            "Kansas"
        ]
    }
]

这是输出

Name,Car,Location
John Doe,"['Car1', 'Car2']",Texas
Jane Roe,Car1,"['Illinois', 'Kansas']"

代码如下:

with open('file.json') as data_file:
    data = json.load(data_file)
df = pd.io.json.json_normalize(data, errors='ignore')

希望它以这样的方式结束:

Name,Car,Location
John Doe,Car1,Texas
John Doe,Car2,Texas
Jane Roe,Car1,Illinois
Jane Roe,Car1,Kansas

在我遇到一个包含额外数据的 json 文件之前,答案非常有效。这就是带有额外值的文件的样子。

{
    Customers:[
    {
        "Name": "John Doe",
        "Car": [
            "Car1",
            "Car2"
        ],
        "Location": "Texas",
        "Repairs: {
            "RepairLocations": {
                "RepairsCompleted":[
                    "Fix1",
                    "Fix2"
                ]
            }
        }
    },
    {
        "Name": "Jane Roe",
        "Car": "Car1",            
        "Location": [
            "Illinois",
            "Kansas"
        ]
    }
]
}

这就是我想要的。我认为它是这种格式中最易读的,但至少应该是所有键

Name,Car,Location,Repairs:RepairLocation
John Doe,Car1,Texas,RepairsCompleted:Fix1
John Doe,Car1,Texas,RepairsCompleted:Fix2
John Doe,Car2,Texas,RepairsCompleted:Fix1
John Doe,Car2,Texas,RepairsCompleted:Fix2
Jane Roe,Car1,Illinois,
Jane Roe,Car1,Kansas,

关于获得第二部分有什么建议吗?

【问题讨论】:

  • 这是python还是jq问题?
  • 我正在使用 jq 和 python 来尝试获取我正在寻找的输出。在标准化之前,我使用 jq 来获取数据。我添加了 jq 以防在规范化之前有办法修复它

标签: json pandas export-to-csv jq


【解决方案1】:

一个简单的 jq 解决方案,它也比这里需要的更通用:

["Name", "Car", "Location"],
(.[]
 | [.Name] + (.Car|..|scalars|[.]) + (.Location|..|scalars|[.]))
| @csv

【讨论】:

    【解决方案2】:

    你正在寻找这样的东西:

    def expand($keys):
        . as $in
        | reduce $keys[] as $k ( [{}];
            map(. + { 
                ($k): ($in[$k] | if type == "array" then .[] else . end)
            })
        ) | .[];
    (.[0] | keys_unsorted) as $h
    | $h, (.[] | expand($h) | [.[$h[]]]) | @csv
    

    REPL demo

    【讨论】:

    • 这很好用,直到我遇到一些包含额外信息的文件。
    • 您对我遇到的问题有什么想法吗?
    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 2020-06-20
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 2022-11-02
    相关资源
    最近更新 更多