Анализ JSON в столбце данных в порядке появления - PullRequest
0 голосов
/ 10 марта 2020

У меня есть фрейм данных, где есть столбец, содержащий 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'}]  

, где столбец Response содержит 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   

, где, если идентификатор является 1-м по порядку, он получает 3 очка, 2 балла, если его второй, и 1 балл, если третий по порядку. Так, например, 1-4 - 1-й в 3-х ответах и ​​2-й в одном, то есть 3x3 + 1x2 = 11 pts. И InResponse означает, сколько вхождений этого идентификатора в кадре данных.

Я пытался

pd.io.json.json_normalize(df.Q1.to_dict())

, но по какой-то причине это дает мне неожиданные результаты. Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 10 марта 2020

Один из способов сделать это - применить к фрейму данных функцию, которая добавляет любые метаданные, которые вам нужно добавить к каждому элементу JSON, затем сгруппировать строки обратно в фрейм данных, а затем применить группировку, например, в python3.

# import data
df = pd.DataFrame(columns=['Player ID', 'Response'], 
                  data=[
                     [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'}]]])


arr = []
def insert_metadata(row):
    i=0
    for item in row:
        item['score'] = 3-i 
        item['In Response'] = 1
        i+=1
        arr.append(item)
    return row

df['Response'].apply(insert_metadata)
final_df = pd.DataFrame(arr)
final_df.groupby('id').sum().reset_index()
0 голосов
/ 10 марта 2020

Я сделал это примерно так -

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

Но мне не особо нравится мое решение. Пожалуйста, дайте мне знать, если у вас есть какие-либо улучшения или альтернативные решения!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...