2017-02-18 1 views
2

Я преобразовал вложенный файл JSON в pandas DataFrame. Некоторые столбцы теперь содержат списки. Они выглядят так:Есть ли способ расширить столбец в pandas Dataframe, содержащий списки и получить имена столбцов из самих значений списка?

0   [BikeParking: True, BusinessAcceptsBitcoin: Fa... 
1   [BusinessAcceptsBitcoin: False, BusinessAccept... 
2   [Alcohol: none, Ambience: {'romantic': False, ... 
3   [AcceptsInsurance: False, BusinessAcceptsCredi... 
4   [BusinessAcceptsCreditCards: True, Restaurants... 
5   [BusinessAcceptsCreditCards: True, ByAppointme... 
6   [BikeParking: True, BusinessAcceptsCreditCards... 
7   [Alcohol: none, Ambience: {'romantic': False, ... 
8      [BusinessAcceptsCreditCards: True] 
9   [BikeParking: True, BusinessAcceptsCreditCards... 
10              None 
. 
. 
. 
144070 [Alcohol: none, Ambience: {'romantic': False, ... 
144071 [BikeParking: True, BusinessAcceptsCreditCards... 
Name: attributes, dtype: object 

и это:

0   [Monday 11:0-21:0, Tuesday 11:0-21:0, Wednesda... 
1   [Monday 0:0-0:0, Tuesday 0:0-0:0, Wednesday 0:... 
2   [Monday 11:0-2:0, Tuesday 11:0-2:0, Wednesday ... 
3   [Tuesday 10:0-21:0, Wednesday 10:0-21:0, Thurs... 
4              None 

144066             None 
144067 [Tuesday 8:0-16:0, Wednesday 8:0-16:0, Thursda... 
144068 [Tuesday 10:0-17:30, Wednesday 10:0-17:30, Thu... 
144069             None 
144070 [Monday 11:0-20:0, Tuesday 11:0-20:0, Wednesda... 
144071 [Monday 10:0-21:0, Tuesday 10:0-21:0, Wednesda... 
Name: hours, dtype: object 

Есть ли способ для меня, чтобы автоматически извлекать теги (BikeParking, AcceptsInsurance и т.д.) и использовать их в качестве имен столбцов при заполнении ячеек с истинными/ложными значениями. Для Ambience dict я хочу сделать что-то вроде Ambience_romantic и true/false в ячейках. Точно так же я хочу извлечь дни недели в виде имен столбцов и использовать часы для заполнения ячеек.

Или есть способ сгладить данные json раньше? Я попытался передать данные json по строкам в json_normalize и создать DataFrame из вывода, но он дает тот же результат. Может быть, я делаю что-то не так?

Формат оригинала JSON (yelp_academic_dataset_business.json):

{ 
    "business_id":"encrypted business id", 
    "name":"business name", 
    "neighborhood":"hood name", 
    "address":"full address", 
    "city":"city", 
    "state":"state -- if applicable --", 
    "postal code":"postal code", 
    "latitude":latitude, 
    "longitude":longitude, 
    "stars":star rating, rounded to half-stars, 
    "review_count":number of reviews, 
    "is_open":0/1 (closed/open), 
    "attributes":["an array of strings: each array element is an attribute"], 
    "categories":["an array of strings of business categories"], 
    "hours":["an array of strings of business hours"], 
    "type": "business" 
} 

Моя попытка с Начальное json_normalize:

with open('yelp_academic_dataset_business.json') as f: 
     #Normalize the json data to flatten it and store output in a dataframe 
     frame= json_normalize([json.loads(line) for line in f]) 

     #write the dataframe to a csv file 
     frame.to_csv('yelp_academic_dataset_business.csv', encoding='utf-8', index=False) 

Что я в настоящее время пытается:

with open(json_filename) as f: 
    data = f.readlines() 

    # remove the trailing "\n" from each line 
    data = map(lambda x: x.rstrip(), data) 

    data_json_str = "[" + ','.join(data) + "]" 

    df = read_json(data_json_str) 
    #Now Looking to expand df['attributes'] and others here 

И я также следует упомянуть, что моя цель - преобразовать его в .csv, чтобы загрузить его в базу данных. Мне не нужны списки в столбцах базы данных.

Вы можете получить исходные данные JSon с сайта Yelp Dataset Вызова: https://www.yelp.ca/dataset_challenge/dataset

+0

Можно ли увидеть оригинальный json и вашу попытку? – Parfait

+0

Добавлен формат json, ссылка на данные и мои попытки. – Koryx

ответ

0

Вы пытаетесь конвертировать «документы» (полу-структурированных данных) в таблицу. Это может быть проблематичным, если одна запись содержит, например, 100 атрибутов, которые не имеют других записей - вы, вероятно, не хотите добавлять 100 колонок в главную таблицу и иметь пустые ячейки для всех других записей.

Но в конце концов вы объяснили, что вы собираетесь сделать это:

  1. нагрузки JSON.
  2. Преобразование в Панды.
  3. Экспорт CSV.
  4. Импорт в базу данных.

И я здесь, чтобы сказать вам, что все это совершенно бессмысленно. Миширование данных через все эти промежуточные форматы вызовет проблемы.

Вместо этого давайте вернемся к основам:

  1. нагрузки JSON.
  2. Написать в базу данных.

Теперь на первом этапе появляется схема. Или, если вы используете базу данных NoSQL, вы можете напрямую загрузить JSON без каких-либо других шагов.

+0

Я должен сделать это с MySQL. И как часть этого задания, я должен написать скрипт для преобразования json в любой формат, который можно загрузить в базу данных MySQL. Я должен написать сценарий. Я понимаю, что это бессмысленно, но я думаю, что это часть упражнения. – Koryx

+0

@Koryx: ОК, так что вы загрузите что-нибудь вроде этого? https://dev.mysql.com/doc/refman/5.7/en/load-data.html Хорошо, если так ... вы можете просто написать скрипт для преобразования входных JSON в CSV. Нет необходимости в Пандах. Рассмотрите возможность написания нескольких связанных таблиц. –

+0

Да, я загружу его вот так. Но как я могу сгладить данные json простым сценарием без использования панд? Не будут ли списки (и dicts внутри них) в столбцах csv создавать проблему при загрузке в MySQL? – Koryx

Смежные вопросы