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)(?<!\w)null(?!\w)", "None").replace(r"(?i)(?<!\w)true(?!\w)", "True").replace(
r"(?i)(?<!\w)false(?!\w)", "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'... 张三 12月7日
1 002 [{'year': '2000', 'day': '1'}, {'year': '2000'... 李四 8月18日
2 003 [{'year': '2001', 'day': '1'}, {'year': '2001'... 王五 3月28日
[2021-09-03 14:15:39,495] test.py->main line:94 [INFO]: 格式化list字段,将一列变成多行
id describes name birthday
0 001 {'year': '1999', 'day': '1'} 张三 12月7日
0 001 {'year': '1999', 'day': '1'} 张三 12月7日
1 002 {'year': '2000', 'day': '1'} 李四 8月18日
1 002 {'year': '2000', 'day': '2'} 李四 8月18日
2 003 {'year': '2001', 'day': '1'} 王五 3月28日
2 003 {'year': '2001', 'day': '2'} 王五 3月28日