我正在尝试通过使用Python和Pandas库对数据科学进行一些实验来弄污自己。
最近我把手放在一本jupyter笔记本上,偶然发现了一段我不知道它如何工作的代码?
这是一行
md['genres'] = md['genres'].fillna('[]').apply(literal_eval).apply(lambda x: [i['name'] for i in x] if isinstance(x, list) else [])
数据集带有一个包含键-值对的genres列,上面的代码删除了键,并且如果存在多个值,则仅用该值替换所有内容。例如作为分隔符插入两者之间
喜剧|动作|戏剧
我想知道代码的实际工作方式!为什么它需要ast提供的literal_eval? lambda函数在做什么?有没有更简洁明了的方式来编写此代码?
答案 0 :(得分:2)
让我们一次迈出这一步:
md['genres'].fillna('[]')
此行用NA
填充系列中NaN
或'[]'
的所有实例。
.apply(literal_eval)
这适用于ast
包中的literal_eval()
。我们可以从以下事实中暗示:NA
值已替换为'[]'
,原始序列包含列表的字符串表示形式,因此literal_eval
用于将这些字符串转换为列表。
.apply(lambda x: [i['name'] for i in x] if isinstance(x, list) else [])
此lambda函数采用以下逻辑:如果值是列表,则映射到包含列表中每个元素的['name']
值的列表,否则映射到空列表。
因此,完整函数的结果是将系列中的每个元素(在原始DF中是列表的字符串表示形式)映射到列表中每个元素的['name']
值列表清单。如果该元素不是列表或NA
,则它将映射到空列表。
答案 1 :(得分:2)
您可以逐行查找:
md['genres'] = md['genres'].fillna('[]')
第一行确保将NaN
单元格替换为代表空列表的字符串。这是因为预计列genres
包含列表。
.apply(literal_eval)
方法ast.literal_eval
用于实际评估字典,而不将其用作字符串。因此,您可以进一步访问键和值。查看更多link。
.apply(
lambda x: [i['name'] for i in x]
if isinstance(x, list)
else []
)
现在,您只是应用一些可以过滤列表的功能。这些列表包含字典。如果它们是列表,则该函数将返回输入中与键name
相关的所有字典值。否则,那将是一个空列表。