首页 > 解决方案 > 在python中将一列取消嵌套到多列中

问题描述

我正在使用以下函数来取消嵌套列:

def flatten_nested_json_df(df):
    df = df.reset_index()

    print(f"original shape: {df.shape}")
    print(f"original columns: {df.columns}")

    # search for columns to explode/flatten
    s = (df.applymap(type) == list).all()
    list_columns = s[s].index.tolist()

    s = (df.applymap(type) == dict).all()
    dict_columns = s[s].index.tolist()

    print(f"lists: {list_columns}, dicts: {dict_columns}")
    while len(list_columns) > 0 or len(dict_columns) > 0:
        new_columns = []

        for col in dict_columns:
            print(f"flattening: {col}")
            # explode dictionaries horizontally, adding new 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:
            print(f"exploding: {col}")
            # explode lists vertically, adding new columns
            df = df.drop(columns=[col]).join(df[col].explode().to_frame())
            new_columns.append(col)

        # check if there are still dict o list fields to flatten
        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()

        print(f"lists: {list_columns}, dicts: {dict_columns}")

    print(f"final shape: {df.shape}")
    print(f"final columns: {df.columns}")
    return df

    df1 = flatten_nested_json_df(df)

df = 数据是[{'id': 123, 'admin_graphql_api_id': 'abc123', 'created_at': '2021-08-20T18:14:38+05:30', 'location_id': 564, 'name': 123.1, 'order_id': 231, 'receipt': {}, 'service': 'manual', 'shipment_status': None, 'status': 'success', 'tracking_company': 'SHIPROCKET', 'tracking_number': 434}]

无法取消嵌套此列

标签: python

解决方案


推荐阅读