【问题标题】:Json read and convert to dataframeJson读取并转换为数据框
【发布时间】:2021-08-28 02:08:47
【问题描述】:

请帮助我阅读下面的 json 并将其转换为数据框。这包含多个 json 对象,我想将每个数组存储为单独的数据框。

使用 open(r"C:\filelocation\file.json","rb") 作为 read_file: 数据 = json.load(read_file)

上面的代码给了我一个完整的数据框,我需要将每个数组存储为一个数据框。 下面是我试图转换为数据帧的 json

{ “q1”:“a1”, “q2”:“a2”, “q3”:“a3”, “q4”:“a4”, “q5”:“a5”, “q6”:“a6”, “细节”: [{ “q7”:“a7”, “q8”:“a8”, “q9”:“a9”, “q10”:“a10”, “q11”:[] }, { “q7”:“a11”, “q8”:“a12”, “q9”:“a13”, “q10”:“a14”, “q11”:[] }, { “q7”:“a15”, “q8”:“a16”, “q9”:“a17”, “q10”:“a18”, “q11”:[] }, { “q7”:“a19”, “q8”:“a20”, “q9”:“a21”, “q10”:“a22”, “q11”:[] }] }

【问题讨论】:

    标签: arrays json pandas dataframe


    【解决方案1】:

    你可以试试这个方法。

    import pandas as pd
    import flatten_json 
    from flatten_json import flatten
    
    d = { "q1": "a1", "q2": "a2", "q3": "a3", "q4": "a4", "q5": "a5", "q6": "a6", "Details": [{ "q7": "a7", "q8": "a8", "q9": "a9", "q10": "a10", "q11": [] }, { "q7": "a11", "q8": "a12", "q9": "a13", "q10": "a14", "q11": [] }, { "q7": "a15", "q8": "a16", "q9": "a17", "q10": "a18", "q11": [] }, { "q7": "a19", "q8": "a20", "q9": "a21", "q10": "a22", "q11": [] }] }
    

    先创建一个df

    df = pd.json_normalize(d)
    

    给出:

    q1  q2  q3  q4  q5  q6                                            Details
    0  a1  a2  a3  a4  a5  a6  [{'q7': 'a7', 'q8': 'a8', 'q9': 'a9', 'q10': '...
    

    并定义如下函数

    def flatten_nested_json_df(df):
        df = df.reset_index()
        s = (df.applymap(type) == list).all()
        list_columns = s[s].index.tolist()
        
        s = (df.applymap(type) == dict).all()
        dict_columns = s[s].index.tolist()
    
        
        while len(list_columns) > 0 or len(dict_columns) > 0:
            new_columns = []
    
            for col in dict_columns:
                horiz_exploded = pd.json_normalize(df[col]).add_prefix(f'{col}.')
                horiz_exploded.index = df.index
                df = pd.concat([df, horiz_exploded], axis=1).drop(columns=[col])
                new_columns.extend(horiz_exploded.columns) # inplace
    
            for col in list_columns:
                
                df = df.drop(columns=[col]).join(df[col].explode().to_frame())
                new_columns.append(col)
    
            s = (df[new_columns].applymap(type) == list).all()
            list_columns = s[s].index.tolist()
    
            s = (df[new_columns].applymap(type) == dict).all()
            dict_columns = s[s].index.tolist()
        return df
    

    最后,展平df:

    print(flatten_nested_json_df(df))
    

    返回:

     index  q1  q2  q3  q4  q5  q6 Details.q7 Details.q8 Details.q9 Details.q10  \
    0      0  a1  a2  a3  a4  a5  a6         a7         a8         a9         a10   
    0      0  a1  a2  a3  a4  a5  a6         a7         a8         a9         a10   
    0      0  a1  a2  a3  a4  a5  a6         a7         a8         a9         a10   
    0      0  a1  a2  a3  a4  a5  a6         a7         a8         a9         a10   
    0      0  a1  a2  a3  a4  a5  a6        a11        a12        a13         a14   
    0      0  a1  a2  a3  a4  a5  a6        a11        a12        a13         a14   
    0      0  a1  a2  a3  a4  a5  a6        a11        a12        a13         a14   
    0      0  a1  a2  a3  a4  a5  a6        a11        a12        a13         a14   
    0      0  a1  a2  a3  a4  a5  a6        a15        a16        a17         a18   
    0      0  a1  a2  a3  a4  a5  a6        a15        a16        a17         a18   
    0      0  a1  a2  a3  a4  a5  a6        a15        a16        a17         a18   
    0      0  a1  a2  a3  a4  a5  a6        a15        a16        a17         a18   
    0      0  a1  a2  a3  a4  a5  a6        a19        a20        a21         a22   
    0      0  a1  a2  a3  a4  a5  a6        a19        a20        a21         a22   
    0      0  a1  a2  a3  a4  a5  a6        a19        a20        a21         a22   
    0      0  a1  a2  a3  a4  a5  a6        a19        a20        a21         a22   
    
      Details.q11  
    0         NaN  
    0         NaN  
    0         NaN  
    0         NaN  
    0         NaN  
    0         NaN  
    0         NaN  
    0         NaN  
    0         NaN  
    0         NaN  
    0         NaN  
    0         NaN  
    0         NaN  
    0         NaN  
    0         NaN  
    0         NaN  
    

    【讨论】:

    • 我的解决方案的优点是你不需要记录路径,它适用于你能想到的任何json字符串。
    【解决方案2】:

    IIUC,你可以试试:

    df = pd.json_normalize(
        json_data, meta=['q1', 'q2', 'q3', 'q4', 'q5', 'q6'], record_path='Details')
    
    

    【讨论】:

      猜你喜欢
      • 2016-10-09
      • 1970-01-01
      • 2021-02-10
      • 2023-02-26
      • 1970-01-01
      • 1970-01-01
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多