我如何弄清楚这段代码在做什么?

时间:2020-02-03 15:41:37

标签: python pandas numpy dataframe lambda

我正在尝试通过使用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函数在做什么?有没有更简洁明了的方式来编写此代码?

2 个答案:

答案 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相关的所有字典值。否则,那将是一个空列表。