首页 > 解决方案 > 如何更正代码?尝试使用带有 lambda if/else 语句的列表推导式使用 pandas 输出

问题描述

想知道为什么我的输出是以下代码指针而不是值 1 或 0。如何更正它(使用 1 行列表理解)?

代码:

winner_A = new['Winner']==new['A']
new['Winner_integer'] = [(lambda x: 1 if winner_A[row] is True else 0) for row in range(len(winner_A))]

电流输出:

array([<function <listcomp>.<lambda> at 0x0000018DB48B8828>,
   <function <listcomp>.<lambda> at 0x0000018DB48B8798>,
   <function <listcomp>.<lambda> at 0x0000018DB48B8678>, ...,
   <function <listcomp>.<lambda> at 0x0000018DB57D7708>,
   <function <listcomp>.<lambda> at 0x0000018DB57D7798>,
   <function <listcomp>.<lambda> at 0x0000018DB57D7828>]

标签: pandasif-statementpointerslambdalist-comprehension

解决方案


您的输出如此奇怪的原因是

(lambda x: 1 if winner_A[row] is True else 0) for row in range(len(winner_A))

(你的列表理解的内容)实际上是一个生成器理解,只生成lambda函数,而不调用它们

您的代码中的另一个缺陷与if winner_A[row] is True. 在 Python 中,is关键字用于测试两个变量是否引用 同一个对象。但是在您的代码片段中:

  • Winner_A[row]是一个布尔表达式(对于row的某些值, 它可能是True),
  • True布尔文字)是另一个对象。

所以if winner_A[row] is True总是False_

生成您想要的东西的更简单的构造是:

new['Winner_integer'] = [ 1 if x else 0 for x in winner_A ]

为我的示例数据返回一个普通的pythonic 列表[1, 0, 0, 1],然后将其“打包”到新列的连续元素中。

然而更简单的 costruct 只是将Winner_Abool类型的 Series)转换为 int类型Series

new['Winner_integer'] = winner_A.astype(int)

返回(也适用于我的示例数据):

0    1
1    0
2    0
3    1
dtype: int32

(检查在没有左侧的情况下运行此代码)。

左列是索引,右列是实际 ( int ) 值。然后这个Series作为新列添加到新的 DataFrame 中。


推荐阅读