Как вставить определенные ключи из файла JSON в фрейм данных в Python - PullRequest
1 голос
/ 12 октября 2019

Прошу прощения, если это очень просто или меня уже спросили, я новичок в Python и работаю с файлами json, поэтому я в замешательстве. ,Эти данные состоят из информации о 3 млн. Человек. У каждого человека есть атрибуты, но не все люди имеют одинаковые атрибуты. Атрибут соответствует ключу в файле json, например:

{
  "_id": "in-00000001",
  "name": {
    "family_name": "Trump",
    "given_name": "Donald"
  },
  "locality": "United States",
  "skills": [
    "Twitter",
    "Real Estate",
    "Golf"
     ],
  "industry": "Government",
  "experience": [
  {
    "org": "Republican",
    "end": "Present",
    "start": "January 2017",
    "title": "President of the United States"
  },
  {
    "org": "The Apprentice",
    "end": "2015",
    "start": "2003",
    "title": "The guy that fires people"
  }]
}

Итак, _id, name, locality, skills, industry и experienceатрибуты (ключи). Другой профиль может иметь дополнительные атрибуты, например education, awards, interests, или не иметь какого-либо атрибута, обнаруженного в другом профиле, например атрибут skills и т. Д.

Что бы ямне нравится сканировать каждый профиль в файле json, и если профиль содержит атрибуты skills, industry и experience, я хотел бы извлечь эту информацию и вставить ее во фрейм данных (я полагаю,Мне для этого нужны панды?)Начиная с experience, я хотел бы специально извлечь имя их текущего работодателя, то есть самый последний список под org. Фрейм данных будет выглядеть так:

    Industry   | Current employer | Skills
    ___________________________________________________________________
    Government | Republican       | Twitter, Real Estate, Golf
    Marketing  | Marketers R Us   | Branding, Social Media, Advertising

... и т. Д. Для всех профилей с этими тремя атрибутами.

Я изо всех сил пытаюсь найти хороший ресурс, который объясняет, какделайте такие вещи, отсюда и мой вопрос.

Полагаю, грубый псевдокод будет:

for each profile in open(path to .json file):
    if profile has keys "experience", "industry" AND "skills":
        on the same row of the data frame:
            insert current employer into "current employer" column of 
            data frame
            insert industry into "industry" column of data frame
            insert list of skills into "skills" column of data frame

Мне просто нужно знать, как написать это на Python.

1 Ответ

1 голос
/ 13 октября 2019

Я предполагаю, что файл содержит все профили, такие как

{
    "profile 1" : {
        # Full object as in the example above
    },
    "profile 2" : {
        #Full object as in the example above
    }
}

Прежде чем продолжить, позвольте мне показать правильный способ использования Pandas DataFrames.

Пример лучшего использования Pandas DataFrames:

Значения в кадре данных Pandas не могут быть списками. Поэтому нам придется дублировать строки, как показано в примере ниже. Проверьте этот вопрос и ответ Д.Д. Лонга для более подробной информации: как использовать списки в качестве значений в пандах?

ID      |    Industry   | Current employer | Skill
___________________________________________________________________
in-01   |    Government | Republican       | Twitter
in-01   |    Government | Republican       | Real Estate
in-01   |    Government | Republican       | Golf
in-02   |    Marketing  | Marketers R Us   | Branding
in-02   |    Marketing  | Marketers R Us   | Social Media
in-02   |    Marketing  | Marketers R Us   | Advertising

Найти объяснения в комментариях в приведенном ниже коде:

import json
import pandas as pd

# Create a DataFrame df with the columns as in the example
df = pd.DataFrame(data, columns = ['ID', 'Industry','Employer','Skill']) 

#Load the file as json. 
with open(path to .json file) as file:
    #readlines() reads the file as string and loads() loads it into a dict
    obj = json.loads(''.join(file.readlines()))
    #Then iterate its items() as key value pairs
    #But the line of code below depends on my first assumption.
    #Depending on the file format, the line below might have to differ.
    for prof_key, profile in obj.items():
        # Verify if a profile contains all the required keys
        if all(key in profile.keys() for key in ("_id","experience", "industry","skills")):
            for skill in profile["skills"]:
                df.loc[-1] = [profile["_id"],
                              profile["industry"],
                              [x for x in profile["experience"] if x["end"] == "Present"][0]["org"],
                              skill]

В приведенной выше строке df.loc[-1] = ... вставляет строку в кадре данных как последнюю строку (индекс -1).

Когда позже вы захотите использовать эту информацию, вам придется использовать df.groupby('ID')

Дайте мне знать, если у вас есть другой формат (ы) в ваших файлах и достаточно ли этого объяснения, чтобы начать работу, или вам нужно больше.

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