В чем разница между `json.loads ()` и `.apply (json.loads)`? - PullRequest
0 голосов
/ 11 ноября 2018

Я довольно новичок в кодировании, и сейчас я пытаюсь работать с набором данных TMDB_5000 из kaggle.

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

[{"cast_id": 242, "character": "Jake Sully", "credit_id": "5602a8a7c3a3685532001c9a", "gender": 2, "id": 65731, "name": "Sam Worthington", "order": 0}, {"cast_id": 3, "character": "Neytiri", "credit_i...}]

Я пытаюсь использовать json.loads() для работы с данными, код credits['cast'] = json.loads(credits['cast']). Но это дает мне такую ​​ошибку

---------------------------------------------------------------------------

TypeError Traceback (самый последний вызов прошлой) в () ----> 1 кредит [[cast]] = json.loads (кредит [[cast]])

/anaconda3/lib/python3.6/json/__init__.py in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant,

object_pairs_hook, ** квт) 346 если не isinstance (s, (bytes, bytearray)): 347 повысить TypeError («объект JSON должен быть str, байтами или байтовым массивом» -> 348 'not {! R}'. Формат (s. class . name )) 349 s = s.decode (detect_encoding (s), 'surrogatepass') 350

TypeError: the JSON object must be str, bytes or bytearray, not 'Series'

Однако код credits['cast'] = credits['cast'].apply(json.loads) работает. Поэтому я очень смущен, потому что я думаю, что нет никакой разницы между этими двумя строками кода.

Кто-нибудь может мне это объяснить?

Ответы [ 3 ]

0 голосов
/ 11 ноября 2018

Проблема в том, что ваша credits переменная - это Pandas DataFrame, поэтому credits['cast'] - это Series).Функция json.loads не знает, как обращаться с типами данных из pandas, поэтому вы получаете сообщение об ошибке, когда выполняете json.loads(credits['cast']).

Однако тип Series имеет метод applyкоторая принимает функцию, которая будет вызываться для каждого значения, которое она содержит.Вот почему credits['cast'].apply(json.loads) работает, он передает json.loads в качестве аргумента apply.

0 голосов
/ 11 ноября 2018

Однако объяснение с большим количеством деталей уже предоставлено, но хотелось бы добавить, если вы используете панды для чтения и обработки данных, тогда вы можете использовать:

import pandas as pd
d_list = [{"cast_id": 242, "character": "Jake Sully", "credit_id": "5602a8a7c3a3685532001c9a", "gender": 2, "id": 65731, "name": "Sam Worthington", "order": 0}, {"cast_id": 3, "character": "Neytiri"}]

Создание DataFrame с использованием DataFrame.from_dict

df = pd.DataFrame.from_dict(d_list)
print(df)

cast_id   character                 credit_id  gender       id             name  order
0      242  Jake Sully  5602a8a7c3a3685532001c9a     2.0  65731.0  Sam Worthington    0.0
1        3     Neytiri                       NaN     NaN      NaN              NaN    NaN

Другой способ, который подходит для этой цели, - pd.read_json с orient='records'.

import pandas as pd
d_list = [{"cast_id": 242, "character": "Jake Sully", "credit_id": "5602a8a7c3a3685532001c9a", "gender": 2, "id": 65731, "name": "Sam Worthington", "order": 0}, {"cast_id": 3, "character": "Neytiri", "credit_i...}]
df = pd.read_json(d_list, orient='records')
print(df
0 голосов
/ 11 ноября 2018

следующий код:

credits['cast'] = credits['cast'].apply(json.loads)

применяет функцию json.loads к каждой строке credits['cast'] (каждая строка является строкой). В результате получается серия декодированных объектов.

Следующий код:

credits['cast'] = json.loads(credits['cast'])

пытается применить ту же функцию к серии credits['cast'], но эту функцию нельзя применить к серии.

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