Преобразовать вложенные в JSON JSON-подобные данные в датафрейм - PullRequest
0 голосов
/ 29 июня 2018

Мои записи выглядят так, и мне нужно записать их в CSV-файл:

my_data={"data":[{"id":"xyz","type":"book","attributes":{"doc_type":"article","action":"cut"}}]}

выглядит как json, но следующая запись начинается с "data", а не "data1", что заставляет меня читать каждую запись отдельно. Затем я преобразую его в dict, используя eval(), для итерации по ключам и значениям для определенного пути, чтобы получить нужные мне значения. Затем я генерирую список ключей и значений на основе ключей, которые мне нужны. Затем pd.dataframe() преобразует этот список в фрейм данных, который я знаю, как преобразовать в CSV. Мой код, который работает ниже. Но я уверен, что есть лучшие способы сделать это. Мой весы плохо. Спасибо.

counter=1
k=[]
v=[]
res=[]
m=0
for line in f2:
    jline=eval(line)
counter +=1
for items in jline:
    k.append(jline[u'data'][0].keys())
    v.append(jline[u'data'][0].values())
print 'keys are:', k
i=0
j=0
while i <3 :
    while j <3:
        if k[i][j]==u'id':
            res.append(v[i][j])
        j += 1    
    i += 1
#res is my result set
del k[:]
del v[:]

1 Ответ

0 голосов
/ 29 июня 2018

Изменение my_data на:

my_data = [{"id":"xyz","type":"book","attributes":{"doc_type":"article","action":"cut"}}, # Data One
{"id":"xyz2","type":"book","attributes":{"doc_type":"article","action":"cut"}}, # Data Two
{"id":"xyz3","type":"book","attributes":{"doc_type":"article","action":"cut"}}] # Data Three

Вы можете выгружать это непосредственно в фрейм данных так:

mydf = pd.DataFrame(my_data)

Не ясно, каким будет ваш путь к данным, но если вы ищете конкретные комбинации id, type и т. Д., Вы можете явно выполнить поиск

def find_my_way(data, pattern):

    # pattern = {'id':'someid', 'type':'sometype'...}
    res = []
    for row in data:
        if row.get('id') == pattern.get('id'):
            res.append(row)
    return row


mydf = pd.DataFrame(find_my_way(mydata, pattern))

EDIT:

Не вдаваясь в то, как работает API, в псевдокоде вы захотите сделать что-то вроде следующего:

my_objects = []
calls = 0
while calls < maximum:

    my_data = call_the_api(params)

    data = my_data.get('data')

    if not data:
        calls+=1
        continue

    # Api calls to single objects usually return a dictionary, to group objects they return lists. This handles both cases
    if isinstance(data, list):
        my_objects = [*data, *my_objects]

    elif isinstance(data, {}):
        my_objects = [{**data}, *my_objects]

# This will unpack the data response into a list that you can then load into a DataFrame with the attributes from the api as the columns

df = pd.DataFrame(my_objects)

Предположим, ваши данные из API выглядят так:

"""
 {
 "links": {},
 "meta": {},
 "data": {
    "type": "FactivaOrganizationsProfile",
    "id": "Goog",
    "attributes": {
      "key_executives": {
        "source_provider": [
          {
            "code": "FACSET",
            "descriptor": "FactSet Research Systems Inc.",
            "primary": true
          }
        ]
      }
    },
    "relationships": {
      "people": {
        "data": {
            "type": "people",
            "id": "39961704"
          }
      }
    }
  },
 "included": {}
 }
 """

согласно документации, поэтому я использую my_data.get('data').

Это должно привести вас все данные (без фильтрации) в DataFrame

Сохранение DataFrame для последнего бита немного более удобно для памяти

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