【问题标题】:Python - Convert the value of a column from a DataFrame to different columnsPython - 将列的值从 DataFrame 转换为不同的列
【发布时间】:2021-07-27 05:39:33
【问题描述】:

看看你能不能帮帮我,我目前有一个JSON文件(这个文件的内容实际上是GET请求的响应,所以我无法修改):

[
    {
        
        "date": "1620157078",
        "value": "{\"license_plate\": \"1111 AAA\", \"brand\": \"Peugeot\"}"
    },
    {
        "date": "1620157080",
        "value": "{\"license_plate\": \"2222 BBB\", \"brand\": \"Audi\"}"
    }
]

我正在做的是将其转换为数据框,以便能够通过以下方式使用它:

import json
import pandas as pd

with open('test.json', 'r') as f:
    file = f.read()
    file_json = json.loads(file)

df = pd.DataFrame(file_json)

df

数据帧内容:

    date        value
0   1620157078  {"license_plate": "1111 AAA", "brand": "Peugeot"}
1   1620157080  {"license_plate": "2222 BBB", "brand": "Audi"}

而我需要将 value 字段的值转换为更多列中的字符串,最终得到这样的:

    date        license_plate   brand
0   1620157078  1111 AAA        Peugeot
1   1620157080  2222 BBB        Audi

我希望你能帮助我,我几乎一整天都在尝试进行修改,但我已经做到了。提前致谢。

【问题讨论】:

    标签: python json pandas dataframe


    【解决方案1】:

    您的 json 将 value 字段作为字符串,而不是字典。您可以使用ast.literal_eval 将它们变成字典:

    from ast import literal_eval
    df = pd.DataFrame(file_json)
    
    (df.drop('value', axis=1)
       .join(pd.DataFrame(df['value'].apply(literal_eval).to_list()))
    )
    

    【讨论】:

    • 非常感谢您的回复和速度,对我帮助很大
    【解决方案2】:

    内置和(Pandas 上游)解决方案包括使用 list comprehensiondictionary unpacking 重新创建 file_json 的字典。

    >>> from ast import literal_eval
    >>> file_json_2 = [{'date': d['date'], **literal_eval(d['value'])} for d in file_json]
    

    然后,就像你已经做的那样

    >>> pd.DataFrame(file_json_2)
             date license_plate    brand
    0  1620157078      1111 AAA  Peugeot
    1  1620157080      2222 BBB     Audi
    
    

    【讨论】:

    • 非常感谢您的回答!但我在执行它时遇到问题:---> 10 file_json_2 = [{'date': d['date'], **d['value']} for d in file_json] TypeError: 'str' object is not a mapping
    • @Kevimuxx69 确实,我误读了您的详细信息。过失。见更新。它现在应该可以工作了。事实上,即不使用literal_eval,它试图解压一个字符串,这在'str' object is not a mapping 之后是不可能的。 literal_eval 在解包之前执行转换为字典的工作。
    • 谢谢!我很欣赏速度
    • 不客气。其实你的也很感激。
    【解决方案3】:
    df = pd.concat([df, df.pop("value").apply(json.loads).apply(pd.Series)], axis=1)
    print(df)
    

    打印:

             date license_plate    brand
    0  1620157078      1111 AAA  Peugeot
    1  1620157080      2222 BBB     Audi
    

    【讨论】:

    • 真的非常感谢,它对我有用。但是您能向我解释一下您是如何实现这种转变的吗?
    • @Kevimuxx69 字典的value键包含另一个需要解析的Json字符串。使用.apply(pd.Series),我将解析后的字典扩展到更多列。
    • 哦,非常感谢您的解释,现在我明白了
    猜你喜欢
    • 2018-01-15
    • 2020-06-13
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 2018-06-02
    • 2021-01-08
    • 2019-06-24
    • 2019-05-19
    相关资源
    最近更新 更多