我有一个数据框,其中有一个包含JSON的列-
Player ID Response
1 [{'id': '1-4', 'content': 'Develop'}, {'id': '1-3', 'content': 'Networking'}, {'id': '1-5', 'content': 'Opportunity'}]
2 [{'id': '1-4', 'content': 'Develop'}]
3 [{'id': '1-3', 'content': 'Networking'}, {'id': '1-4', 'content': 'Develop'}, {'id': '1-2', 'content': 'Excuse'}]
4 [{'id': '1-4', 'content': 'Develop'}, {'id': '1-6', 'content': 'Gain'}, {'id': '1-1', 'content': 'Different'}]
其中“响应”列按顺序包含1-3个实体。我需要将该列重新排序为-
ID Score InResponse
1-1 1 1
1-2 1 1
1-3 5 2
1-4 11 4
1-5 1 1
1-6 2 1
其中,如果ID顺序为1,则获得3分;如果ID为第二,则获得2分;如果ID为3,则获得1分。因此,例如1-4是3响应中的第1响应,而2则是2的响应,因此3x3 + 1x2 = 11 pts
。“ InResponse”表示该ID在数据帧中出现了多少次。
我试过了
pd.io.json.json_normalize(df.Q1.to_dict())
但由于某种原因,它给了我意外的结果。我怎样才能做到这一点?
问题来源:stackoverflow
我做了这样的事情-
dict_response = {'1-1':0, '1-2':0, '1-3':0, '1-4':0, '1-5':0, '1-6':0, '1-7':0}
dict_occurrence = {'1-1':0, '1-2':0, '1-3':0, '1-4':0, '1-5':0, '1-6':0, '1-7':0}
for index, row in df.iterrows():
dict_temp = json.loads(row['Response'].replace("'", '"'))
dict_response[list(dict_temp[0].values())[0]] += 3
dict_occurrence[list(dict_temp[0].values())[0]] += 1
if len(dict_temp) > 1:
dict_response[list(dict_temp[1].values())[0]] += 2
dict_occurrence[list(dict_temp[1].values())[0]] += 1
if len(dict_temp) > 2:
dict_response[list(dict_temp[2].values())[0]] += 1
dict_response[list(dict_temp[2].values())[0]] += 1
df_q1_responses = pd.DataFrame()
df_q1_responses['ID'] = dict_response.keys()
df_q1_responses['Points'] = df_q1_responses['ID'].map(dict_response)
df_q1_responses['Responses'] = df_q1_responses['ID'].map(dict_occurrence)
df_q1_responses
但是我不是特别喜欢我的解决方案。如果您有任何改进或替代解决方案,请告诉我!
回答来源:stackoverflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。