我正在通过API合并调查结果,并希望将这些结果转换为如下所示的数据框:
PersonId | Question | Answer | Department
要实现这一目标,每一行必须是一个人的一个问题和答案对,包括第一个问题的部门。因此,在这种情况下,它应如下所示:
PersonId | Question | Answer | Department
1 | I can focus on clear targets | 3 | Department A
1 | I am satisfied with my working environment| 4 | Department A
2 | I can focus on clear targets | 1 | Department B
2 | I am satisfied with my working environment| 3 | Department B
这是从api检索并合并后的数据外观。我不需要“答案”和“ id”键,因为“结果”包含参与者给出的答案。答案始终在1到5的范围内。
[
{
'0': {
'title': 'What department do you work at?',
'id': '2571050',
'results': {
'0': 'Department A',
'1': '',
},
'answers': {
'0': 'Department A',
'1': 'Department B',
}
},
'1': {
'title': 'I can focus on clear targets',
'id': '5275962',
'results': {
'0': '3'
},
'answers': {
'0': 'Strongly disagree',
'1': 'Strongly Agree'
}
},
'2': {
'title': 'I am satisfied with my working environment',
'id': '5276045',
'results': {
'0': '4'
},
'answers': {
'0': 'Strongly Disagree',
'1': 'Strongly Agree'
}
},
},
{
'0': {
'title': 'What department do you work at?',
'id': '2571050',
'results': {
'0': '',
'1': 'Department B',
},
'answers': {
'0': 'Department A',
'1': 'Department B',
}
},
'1': {
'title': 'I can focus on clear targets',
'id': '5275962',
'results': {
'0': '1'
},
'answers': {
'0': 'Strongly disagree',
'1': 'Strongly Agree'
}
},
'2': {
'title': 'I am satisfied with my working environment',
'id': '5276048',
'results': {
'0': '3'
},
'answers': {
'0': 'Strongly Disagree',
'1': 'Strongly Agree'
}
}
}
]
答案 0 :(得分:2)
请注意,您的JSON文件包含一些错误。词典的最后一个值的末尾不应包含逗号。对于字典的键/值,还应该使用双引号而不是单引号。我在答案的末尾链接了正确的JSON文件。
要回到您的问题,您可以使用json和pandas库来解析您的文件。这可能是这样的:
import json
import pandas as pd
df = pd.DataFrame({'PersonId' : [], 'Question' : [], 'Answer' : [], 'Department' : []})
i = 1
for people in data:
# We assign an id to the answerer
person_id = i
i += 1
#We retrieve the department of the answerer
if people['0']['results']['0'] != '':
department = people['0']['results']['0']
else:
department = people['0']['results']['1']
for answer in people:
#if we are not asking for the department :
new_row = {'PersonId' : person_id, 'Department' : department}
if answer != '0':
# We collect the question and the answer
new_row['Question'] = people[answer]['title']
new_row['Answer'] = people[answer]['results']['0']
df = df.append(new_row, ignore_index = True)
输出:
PersonId Question Answer Department
0 1.0 I can focus on clear targets 3 Department A
1 1.0 I am satisfied with my working environment 4 Department A
2 2.0 I can focus on clear targets 1 Department B
3 2.0 I am satisfied with my working environment 3 Department B
JSON文件:
[
{
"0": {
"title": "What department do you work at?",
"id": "2571050",
"results": {
"0": "Department A",
"1": ""
},
"answers": {
"0": "Department A",
"1": "Department B"
}
},
"1": {
"title": "I can focus on clear targets",
"id": "5275962",
"results": {
"0": "3"
},
"answers": {
"0": "Strongly disagree",
"1": "Strongly Agree"
}
},
"2": {
"title": "I am satisfied with my working environment",
"id": "5276045",
"results": {
"0": "4"
},
"answers": {
"0": "Strongly Disagree",
"1": "Strongly Agree"
}
}
},
{
"0": {
"title": "What department do you work at?",
"id": "2571050",
"results": {
"0": "",
"1": "Department B"
},
"answers": {
"0": "Department A",
"1": "Department B"
}
},
"1": {
"title": "I can focus on clear targets",
"id": "5275962",
"results": {
"0": "1"
},
"answers": {
"0": "Strongly disagree",
"1": "Strongly Agree"
}
},
"2": {
"title": "I am satisfied with my working environment",
"id": "5276048",
"results": {
"0": "3"
},
"answers": {
"0": "Strongly Disagree",
"1": "Strongly Agree"
}
}
}
]