从Pandas列(字典列表)中提取值

qmb5sa22  于 2023-01-24  发布在  其他
关注(0)|答案(2)|浏览(260)

一个名为top_chart_movies的panda Dataframe ,它有一个列genres,该列有一个字典列表,如下图

所示
列值在列表中具有不同数量的字典项。
如何将值提取为列表并将其包含到另一列genres1中,其中
top_chart_movies [类型1]. head(2)

1881  ["Drama","Crime"]
3337 ["Drama","Crime"]

我尝试了下面的代码,但它不工作.

top_chart_movies['genres1'] = [value for key, value in top_chart_movies['genres']]

编辑:当我键入以下代码时

top_chart_movies['genres'].iloc[1]

我得到:

'[{"id": 18, "name": "Drama"}, {"id": 80, "name": "Crime"}]'

因此,这些值存储为字符串。

mkshixfv

mkshixfv1#

这应该行得通:

top_chart_movies['genres1'] = [[genres_item['name'] for genres_item in genres_list] for genres_list in top_chart_movies["genres"]]

工作原理:如果我们迭代top_chart_movies["genres"],如下所示:for genres_list in top_chart_movies["genres"],则对于每一行,genres_list将包含一个字典列表,字典的关键字为"id""name"。例如,在第一行中,genres_list将为[{"id": 18, "name": "Drama"}, {"id": 80, "name": "Crime"}]
对于每一行,我们在genres_list上迭代,例如for genres_item in genres_list,在genres_item中的每一次迭代都得到一个字典,例如{"id": 18, "name": "Drama"},然后我们只取"name"部分:genres_item["name"].
因此,对于每一行,为了获得流派的"name"元素的列表,我们执行[genres_item['name'] for genres_item in genres_list],并在每一行中执行如下操作:[[genres_item['name'] for genres_item in genres_list] for genres_list in top_chart_movies["genres"]]

    • 编辑:**

正如提问者所指出的,原来genres列表是字符串表示的,但是没有指定是python的字符串表示还是json的字符串表示还是其他的,所以我们只能用json.loads或者ast.literal_eval解析。
如果它在json string中,应该可以:

import json
top_chart_movies['genres1'] = [[genres_item['name'] for genres_item in json.loads(genres_list)] for genres_list in top_chart_movies["genres"]]

如果它是python字符串表示形式,这应该可以工作:

from ast import literal_eval
top_chart_movies['genres1'] = [[genres_item['name'] for genres_item in literal_eval(genres_list)] for genres_list in top_chart_movies["genres"]]
h7appiyu

h7appiyu2#

def get_genre(lst):
    return [item["name"] for item in lst]

top_chart_movies['genres1'] = top_chart_movies['genres'].map(get_genre)

您不需要与每个键关联的所有值,而只需要与每个键["name"]对应的值。
一旦知道如何从一个列表中提取它们,就可以将该函数map到列表列中。

相关问题