Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取json文件的相同子键的值_Python_Json_Pandas_List - Fatal编程技术网

Python 获取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,

我想将一种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, 
            "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"}
}