Python 获取json文件的相同子键的值
我想将一种json文件格式转换为另一种格式。 输入json文件如下所示:Python 获取json文件的相同子键的值,python,json,pandas,list,Python,Json,Pandas,List,我想将一种json文件格式转换为另一种格式。 输入json文件如下所示: json1 = {"Roll Number":{"0":"12345675890"},"Exam Code":{"0":"125"},"q1":{"0":"A"},"q2":{"0":"B"},"q3":{"0":"B"},"q4":{"0":"C"},"q5":{"0":"C"} 这里你可以把0作为零学生(第一学生答题表) 我想要这个输出格式 json2 = { "id": 1,
json1 = {"Roll Number":{"0":"12345675890"},"Exam Code":{"0":"125"},"q1":{"0":"A"},"q2":{"0":"B"},"q3":{"0":"B"},"q4":{"0":"C"},"q5":{"0":"C"}
这里你可以把0作为零学生(第一学生答题表)
我想要这个输出格式json2 = {
"id": 1,
"Roll Number": 12345675890,
"Exam Code": 125,
"qtn_ans_id": 1, #this is question number
"field1": 0,
"field2": 0,
"field3": 1, #if ans is C then field3=1 and else is 0
"field4": 0,
}
在json1中,它包含5个问题答案和详细信息,我想将其转换为json2,我的代码是
导入json
将json文件存储到数据中
with open('json1.json') as data_file:
data = json.load(data_file)
写入默认格式
format = {"table": "omr",
"rows":
[
{
"id": 1,
"regist_no": 1215152,
"exam_id": 125,
"qtn_ans_id": 1,
"field1": 0,
"field2": 0,
"field3": 0,
"field4": 0,
}
]
}
我的伪代码
json2 = {}
for (k, v) in data.items():
if(k=='Roll Number'):
format['rows'][0]['regist_no']=v['0']
if(k=='Exam Code'):
format['rows'][0]['exam_id'] = v['0']
if(v['0']=='A'):
format['rows'][0]['field1'] = 1
elif(v['0']=='B'):
format['rows'][0]['field2'] = 1
elif(v['0']=='C'):
format['rows'][0]['field3'] = 1
elif(v['0']=='D'):
format['rows'][0]['field4'] = 1
json2.append(format['rows'])
我得到的错误输出是
[{
'field1': 1,
'field2': 1,
'field3': 1,
'field4': 1
}]
所有字段值均为1。
对于答案,正确的输出可以是
[{
'field1': 1,
'field2': 0,
'field3': 0,
'field4': 0
}]
或者有没有其他方法,比如使用熊猫数据帧。
我知道这是一个冗长而愚蠢的问题,但如果有人能帮忙,我会很高兴。谢谢大家! 像这样的怎么样
# assuming your json data looks like this:
json1 = [
{
"Roll Number" : {"0":"12345675890"},
"Exam Code" : {"0":"125"},
"q1" : {"0":"A"},
"q2" : {"0":"B"},
"q3" : {"0":"B"},
"q4" : {"0":"C"},
"q5" : {"0":"C"},
},
{
"Roll Number" : {"0":"12345675891"},
"Exam Code" : {"0":"125"},
"q1" : {"0":"C"},
"q2" : {"0":"B"},
"q3" : {"0":"A"},
"q4" : {"0":"C"},
"q5" : {"0":"D"},
},
]
然后:
将导致:
# output of json1:
[{'Roll Number': {'0': '12345675890'},
'Exam Code': {'0': '125'},
'q1': {'field1': 1, 'field2': 0, 'field3': 0, 'field4': 0},
'q2': {'field1': 0, 'field2': 1, 'field3': 0, 'field4': 0},
'q3': {'field1': 0, 'field2': 1, 'field3': 0, 'field4': 0},
'q4': {'field1': 0, 'field2': 0, 'field3': 1, 'field4': 0},
'q5': {'field1': 0, 'field2': 0, 'field3': 1, 'field4': 0}},
{'Roll Number': {'0': '12345675891'},
'Exam Code': {'0': '125'},
'q1': {'field1': 0, 'field2': 0, 'field3': 1, 'field4': 0},
'q2': {'field1': 0, 'field2': 1, 'field3': 0, 'field4': 0},
'q3': {'field1': 1, 'field2': 0, 'field3': 0, 'field4': 0},
'q4': {'field1': 0, 'field2': 0, 'field3': 1, 'field4': 0},
'q5': {'field1': 0, 'field2': 0, 'field3': 0, 'field4': 1}}]
我的解决方案比另一个答案更“泛达索尼克”
从定义一个函数开始,该函数将用于更改
将答案代码添加到4个答案列:
def ans(code):
return pd.Series([ int(code == x) for x in 'ABCD' ],
index=[ 'field' + str(i) for i in range(1, 5)])
将输入文件读入数据框,如下所示:
with open('input.json') as data_file:
df = pd.read_json(data_file, orient='columns')
然后重新格式化,保存在另一个数据帧中:
df2 = pd.wide_to_long(df.rename_axis(index='id').reset_index(),
stubnames='q', i='Roll Number', j='qtn_ans_id').reset_index()\
.reindex(columns=['id', 'Roll Number', 'Exam Code', 'qtn_ans_id', 'q'])
现在它包含一列q和答案代码。
因此,要将每个字段更改为4列,请运行:
df2 = df2.join(df2.q.apply(ans)).drop(columns=['q'])
最后一步是创建输出JSON字符串:
df2.to_json(orient='records')
例如,您可以将其保存在输出文件中
注意:如果您的输入包含例如两名学生的数据,
JSON文件应具有以下格式:
{
"Roll Number":{"0":12345675890,"1":23456758901},
"Exam Code":{"0":125,"1":125},
"q1":{"0":"A","1":"A"},
"q2":{"0":"B","1":"B"},
"q3":{"0":"B","1":"C"},
"q4":{"0":"C","1":"D"},
"q5":{"0":"C","1":"C"}
}
(与另一个答案中建议的输入格式不同)。谢谢,我为字段获取了它。在json1中,两个学生的格式是,
json1=[{“卷号”:{“0”:“12345675890”},“考试代码”:{“0”:“125”},“q1”:{“0”:“A”},“q2”:{“0”:“B”},“q3”:{“0”:“B”},“q4”:{“0”:“C”},“q5”:{“0”:“C”},{“卷号”:“1”:“12345675891”},“考试代码:{“1”:“125”},q1:{“1”:“C”},q2:{“1”:“B”},q3:{“1”:“A”},q4:{“1”:“C”},q5:{“1”:“D”},}]
第二名学生的索引是1而不是0。那么如何将第二名学生的卷号和字段附加到输出列表中?我明白了-我编辑了上面的代码-如果不起作用,请告诉我。
{
"Roll Number":{"0":12345675890,"1":23456758901},
"Exam Code":{"0":125,"1":125},
"q1":{"0":"A","1":"A"},
"q2":{"0":"B","1":"B"},
"q3":{"0":"B","1":"C"},
"q4":{"0":"C","1":"D"},
"q5":{"0":"C","1":"C"}
}