时间:2018-11-11 03:53:03

标签: python pandas

我对编码还很陌生,现在我正尝试使用kaggle的TMDB_5000数据集。

尝试处理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跟踪(最近的呼叫   持续)        在()中       ----> 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,** kw)           第346章救人(二更)           347提高TypeError('JSON对象必须是str,字节或字节数组,'       -> 348'not {!r}'。format(s。 class name ))           第349章(第349话)           350

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

但是,代码credits['cast'] = credits['cast'].apply(json.loads)有效。所以我很困惑,因为我认为这两行代码之间没有区别。

有人可以向我解释吗?

3 个答案:

答案 0 :(得分:0)

以下代码:

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

将函数json.loads应用于credits['cast']的每一行(每一行都是一个字符串)。结果是一系列解码的对象。

以下代码:

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

试图将相同的功能应用于系列credits['cast'],但是该功能不能应用于系列。

答案 1 :(得分:0)

问题是您的credits变量是熊猫DataFrame,所以credits['cast']Series)。 json.loads函数不知道如何处理pandas中的数据类型,因此在执行json.loads(credits['cast'])时会出错。

然而,Series类型具有一个apply方法,该方法接受要对其包含的每个值调用的函数。这就是credits['cast'].apply(json.loads)起作用的原因,它将json.loads传递为apply的参数。

答案 2 :(得分:0)

但是已经提供了非常详细的解释,但是如果您要使用熊猫来读取和处理数据,则可以添加以下解释:

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.from_dict

创建一个DataFrame
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_jsonorient='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