【问题标题】:How do I figure out what this code is doing?我如何弄清楚这段代码在做什么?
【发布时间】:2020-02-03 15:41:37
【问题描述】:

我正在尝试通过使用 Python 和 Pandas 库对数据科学进行一些实验来亲自动手。

最近我拿到了一个 jupyter notebook 并偶然发现了一段我无法弄清楚它是如何工作的代码?

这条线

md['genres'] = md['genres'].fillna('[]').apply(literal_eval).apply(lambda x: [i['name'] for i in x] if isinstance(x, list) else [])

数据集带有一个包含键值对的流派列,如果存在多个值,上面的代码会删除键并仅用值替换所有内容例如,作为两者之间的分隔符插入

喜剧 |行动 |剧情

我想知道代码实际上是如何工作的!为什么它需要来自ast的literal_eval? lambda 函数在做什么?!有没有更简洁明了的写法?

【问题讨论】:

  • 使用pandas 并不是将困难的原因方法链接在一起。因此,这意味着您必须了解每种方法的作用,例如 .fillna()apply(literal_eval) 等,以了解发生了什么变化。
  • 我的建议是在每个链式函数中将代码拆分为多个片段(将每个 .apply() 移到自己的行上并每次重新分配列)并在应用每个函数后检查输出

标签: python pandas numpy dataframe lambda


【解决方案1】:

让我们一步一步来:

md['genres'].fillna('[]')

此行用'[]' 填充系列中NANaN 的所有实例。

.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,则映射到空列表。

【讨论】:

    【解决方案2】:

    您可以逐行查找:

    md['genres'] = md['genres'].fillna('[]')  
    

    第一行确保NaN 单元格被替换为表示空列表的字符串。这是因为genres 列应该包含列表。

                               .apply(literal_eval)
    

    ast.literal_eval 方法用于实际评估字典,而不是将它们用作字符串。因此,您可以进一步访问键和值。查看更多here

                               .apply(
                                 lambda x: [i['name'] for i in x]
                                           if isinstance(x, list) 
                                           else []
                                 )
    

    现在您只是应用了一些功能来过滤您的列表。这些列表包含字典。如果它们是列表,该函数将返回与您的输入中的键 name 关联的所有字典值。否则,这将是一个空列表。

    【讨论】:

      猜你喜欢
      • 2011-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-09
      • 2015-04-05
      • 2014-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多