python 将一行list(json)转为多行多列

from common.json2csvAnalyzer import *
from utils.logger import MyLogging
import json
import datetime
import pandas as pd

logger = MyLogging().get_log()


def rename_ods_output_cols(df, output_cols):
    """
    字段重命名,并增加ods操作的字段
    :param df: input data frame
    :param output_cols: 输出匹配字段
    :return: df
    """
    cols = json.loads(output_cols, strict=False)
    df_result = json2csvAnalyzer().execute(cols)
    df_result["order"] = pd.to_numeric(df_result["order"], errors='coerce')

    df_result = df_result.sort_values(by=['order'])
    original_cols = df_result['original'].to_list()
    output_cols = df_result['output'].to_list()

    df = df[original_cols]
    df.columns = output_cols
    # 增加ods操作字段
    df['ods_update_time'] = str(datetime.datetime.now())
    df['ods_is_deleted'] = 0
    df['ods_update_by'] = 1
    return df


def list_format(df, json_column):
    """
    拆分表格
    :param df:
    :param json_column:
    :return:
    """
    # df[{},{}] 拆层多行,先过滤None,null,[],再进行拆分
    df = df.loc[
        (df[json_column].notnull()) & (~df[json_column].isin(['None', 'null']))]
    df_mask = df[json_column].apply(lambda x: x != [])
    df = df[df_mask]

    # 格式化
    df[json_column] = df[json_column].apply(
        lambda x: str(x).replace(r"(?i)(?, "None").replace(r"(?i)(?, "True").replace(
            r"(?i)(?, "False"))
    df[json_column] = df[json_column].map(eval)
    # list[json] -> 多行json
    df = df.explode(json_column)
    return df


def json_format(df, json_column):
    """
    将一列json字段转换成多列字段 {k1:v1,k2:v2} -> k1 k2
                                             v1 v2
    :param df:
    :param json_column:
    :return:
    """
    df[json_column] = df[json_column].map(eval)
    tmp = df[json_column].apply(pd.Series)
    df[tmp.columns] = tmp
    # drop centralAreas
    df = df.drop(columns=[json_column])
    return df


def main():
    """
    1、并将list[json] 转成多行json
    2、测试json转成多列
    :return:
    """
    logger.info("原始数据")
    df = pd.DataFrame({"id": ["001", "002", "003"],
                       "info": [str({"name": "张三", "birthday": "12月7日"}),
                                str({"name": "李四", "birthday": "8月18日"}),
                                str({"name": "王五", "birthday": "3月28日"})],
                       "describes": [
                           [str({"year": "1999", "day": "1"}), str({"year": "1999", "day": "1"})],
                           [str({"year": "2000", "day": "1"}), str({"year": "2000", "day": "2"})],
                           [str({"year": "2001", "day": "1"}), str({"year": "2001", "day": "2"})]
                       ]
                       })
    print(df)
    logger.info("格式化json字段,将一列变成多列")
    json_format_df = json_format(df, "info")
    print(json_format_df)
    logger.info("格式化list字段,将一列变成多行")
    list_format_df = list_format(json_format_df, "describes")
    print(list_format_df)


if __name__ == '__main__':
    main()

演示结果

[2021-09-03 14:15:39,438] test.py->main line:79 [INFO]: 原始数据
    id  ...                                          describes
0  001  ...  [{'year': '1999', 'day': '1'}, {'year': '1999'...
1  002  ...  [{'year': '2000', 'day': '1'}, {'year': '2000'...
2  003  ...  [{'year': '2001', 'day': '1'}, {'year': '2001'...

[3 rows x 3 columns]
[2021-09-03 14:15:39,469] test.py->main line:91 [INFO]: 格式化json字段,将一列变成多列
    id                                          describes name birthday
0  001  [{'year': '1999', 'day': '1'}, {'year': '1999'...   张三    1271  002  [{'year': '2000', 'day': '1'}, {'year': '2000'...   李四    8182  003  [{'year': '2001', 'day': '1'}, {'year': '2001'...   王五    328[2021-09-03 14:15:39,495] test.py->main line:94 [INFO]: 格式化list字段,将一列变成多行
    id                     describes name birthday
0  001  {'year': '1999', 'day': '1'}   张三    1270  001  {'year': '1999', 'day': '1'}   张三    1271  002  {'year': '2000', 'day': '1'}   李四    8181  002  {'year': '2000', 'day': '2'}   李四    8182  003  {'year': '2001', 'day': '1'}   王五    3282  003  {'year': '2001', 'day': '2'}   王五    328

你可能感兴趣的:(Python,python,list,json)