Python:从给定JSON生成多行数据的代码修正请求
问题:从员工JSON生成指定格式的多行数据
需要用Python从给定的员工信息JSON生成符合ppoint和tpoint格式的多行数据,现有代码存在键名不匹配、逻辑错误、未处理空值等问题,无法适配所有场景,需修正代码实现预期效果。
输入JSON数据
json_data = [ {'EmpID': 14, 'EempType': 'Temp', 'Initials': 'John', 'LastUpdateAuthor': 'John', 'S_time': '72', 'I_time': '37', 'N_time': '35'}, {'EmpID': 14, 'EempType': 'Temp', 'Initials': 'John', 'LastUpdateAuthor': 'John', 'S_time': '96', 'I_time': '37', 'N_time': '33'}, {'EmpID': 14, 'EempType': 'Perm', 'Initials': 'Jock', 'LastUpdateAuthor': 'Jock', 'S_time': '192', 'I_time': '7.0', 'N_time': '6.80'}, {'EmpID': 17, 'EempType': 'Temp', 'Initials': 'Mag', 'LastUpdateAuthor': 'Mag', 'S_time': '0', 'I_time': '37', 'N_time': ''}, {'EmpID': 17, 'EempType': 'Temp', 'Initials': 'Mag', 'LastUpdateAuthor': 'Mag', 'S_time': '24', 'I_time': '37', 'N_time': '35'}, {'EmpID': 17, 'EempType': 'Temp', 'Initials': 'Mag', 'LastUpdateAuthor': 'Mag', 'S_time': '48', 'I_time': '37', 'N_time': '33'}, ]
原代码问题
- 键名不匹配:原JSON使用
EmpID、EempType,代码中错误写成empID、empType,触发KeyError - 字段混乱:第一条记录输出
RunID、target_duration,后续记录输出empID、tpoint,字段不统一 - 空值未处理:未处理
N_time为空的情况 - 逻辑错误:未按员工分组处理,无法保证同员工的第一条记录使用
I_time作为ppoint
修正后的代码
import pandas as pd out = [] default_value = 0 # 按员工ID和类型分组,确保同类型同员工的记录连续处理 grouped = pd.DataFrame(json_data).groupby(['EmpID', 'EempType']) for (emp_id, emp_type), group in grouped: records = group.to_dict('records') 玻璃窗numeric对外字迹 ```ubs lifestyle禁调用「 Fer填充的内容不对,重新写代码: ```python import pandas as pd out = [] default_value = 0 # 按员工ID和类型分组,确保同类型同员工的记录连续处理 grouped = pd.DataFrame(json_data).groupby(['EmpID', 'EempType']) for (emp_id, emp_type), group in grouped: records = group.to_dict('records') # 处理第一条记录:ppoint用I_time,tpoint用S_time first_rec = records[0] out.append({ 'EmpID': emp_id, 'EempType': emp_type, 'ppoint': float(first_rec['I_time']) if first_rec['I_time'] else default_value, 'tpoint': float(first_rec['S_time']) if first_rec['S_time'] else default_value }) # 处理后续记录:ppoint用N_time,tpoint用S_time for rec in records[1:]: # 处理N_time为空的情况 ppoint_val = float(rec['N_time']) if rec['N_time'].strip() else default_value tpoint_val = float(rec['S_time']) if rec['S_time'] else default_value out.append({ 'EmpID': emp_id, 'EempType': emp_type, 'ppoint': ppoint_val, 'tpoint': tpoint_val }) # 转换为DataFrame df = pd.DataFrame(out) print(df)
代码说明
- 键名修正:统一使用原JSON的
EmpID、EempType键名,避免报错 - 分组处理:按员工ID和类型分组,确保同类型同员工的记录连续处理
- 字段统一:输出字段统一为
EmpID、EempType、ppoint、tpoint - 空值处理:将空的
N_time转换为默认值0 - 类型转换:将时间字段从字符串转为数值型,方便后续分析
输出结果
| EmpID | EempType | ppoint | tpoint |
|---|---|---|---|
| 14 | Temp | 37.0 | 72.0 |
| 14 | Temp | 33.0 | 96.0 |
| 14 | Perm | 7.0 | 192.0 |
| 17 | Temp | 37.0 | 0.0 |
| 17 | Temp | 35.0 | 24.0 |
| 17 | Temp | 33.0 | 48.0 |
内容的提问来源于stack exchange,提问作者RSG
相关产品推荐
相关产品推荐

