【问题标题】:Python Pandas - Json to DataFramePython Pandas - Json 到 DataFrame
【发布时间】:2017-04-29 09:17:47
【问题描述】:

我有一个复杂的 Json 文件,如下所示:

{
  "User A" : {
     "Obj1" : {
        "key1": "val1",
        "key2": "val2",
        "key3": "val3",
     }
     "Obj2" : {
        "key1": "val1",
        "key2": "val2",
        "key3": "val3"
     }
  }
  "User B" : {
     "Obj1" : {
        "key1": "val1",
        "key2": "val2",
        "key3": "val3",
        "key4": "val4"
     }
  }
}

我想把它变成一个如下所示的数据框:

                key1   key2   key3   key4
User A   Obj1   val1   val2   val3    NaN
         Obj2   val1   val2   val3    NaN
User B   Obj1   val1   val2   val3    val4

熊猫可以做到这一点吗?如果是这样,我该怎么做?

  • 如果更简单,我不介意删除 User 和 Obj 的前两列,只保留键的列。

【问题讨论】:

    标签: python json pandas dataframe


    【解决方案1】:

    你可以先读文件到dict:

    with open('file.json') as data_file:    
        dd = json.load(data_file)
    
    print(dd)
    {'User B': {'Obj1': {'key2': 'val2', 'key4': 'val4', 'key1': 'val1', 'key3': 'val3'}}, 
    'User A': {'Obj1': {'key2': 'val2', 'key1': 'val1', 'key3': 'val3'}, 
    'Obj2': {'key2': 'val2', 'key1': 'val1', 'key3': 'val3'}}}
    

    然后将dict comprehensionconcat 一起使用:

    df = pd.concat({key:pd.DataFrame(dd[key]).T for key in dd.keys()})
    print (df)
                 key1  key2  key3  key4
    User A Obj1  val1  val2  val3   NaN
           Obj2  val1  val2  val3   NaN
    User B Obj1  val1  val2  val3  val4
    

    使用read_json 的另一种解决方案,但首先需要通过unstack 重塑并通过dropna 删除NaN 行。最后需要DataFrame.from_records

    df = pd.read_json('file.json').unstack().dropna()
    print (df)
    User A  Obj1     {'key2': 'val2', 'key1': 'val1', 'key3': 'val3'}
            Obj2     {'key2': 'val2', 'key1': 'val1', 'key3': 'val3'}
    User B  Obj1    {'key2': 'val2', 'key4': 'val4', 'key1': 'val1...
    dtype: object
    
    df1 = pd.DataFrame.from_records(df.values.tolist())
    print (df1)
       key1  key2  key3  key4
    0  val1  val2  val3   NaN
    1  val1  val2  val3   NaN
    2  val1  val2  val3  val4
    

    df1 = pd.DataFrame.from_records(df.values.tolist(), index = df.index)
    print (df1)
                 key1  key2  key3  key4
    User A Obj1  val1  val2  val3   NaN
           Obj2  val1  val2  val3   NaN
    User B Obj1  val1  val2  val3  val4
    

    【讨论】:

    • 你很有帮助,谢谢!无法想象我花了一个小时来完成可以用两行代码完成的事情,如此优雅......有没有一种简单的方法也可以将此 df 保存为 excel 文件?
    • 感谢您的采纳!当然,如果需要删除索引,请使用 to_excel - df1.to_excel('file.xlsx')df1.to_excel('file.xlsx', index=False)
    猜你喜欢
    • 2014-11-02
    • 2020-02-25
    • 2018-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 2018-06-09
    相关资源
    最近更新 更多