pandas - 如何更正代码?尝试使用带有 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>]
解决方案
您的输出如此奇怪的原因是
(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_A(bool类型的 Series)转换为 int类型的Series:
new['Winner_integer'] = winner_A.astype(int)
返回(也适用于我的示例数据):
0 1
1 0
2 0
3 1
dtype: int32
(检查在没有左侧的情况下运行此代码)。
左列是索引,右列是实际 ( int ) 值。然后这个Series作为新列添加到新的 DataFrame 中。
推荐阅读
- html - flexbox 容器内的 Divs 动画
- php - 创建多维数组,并处理 json_encode 的相同键名问题
- c++ - 链接 DLL 后空 QT GUI 崩溃
- javascript - JavaScript:如何在执行条件的特定持续时间后清除间隔
- python-3.x - Matplotlib 故障 [python3]
- laravel - laravel 会在返回的模型集合的任何位置重新连接到数据库吗?
- javascript - 过滤在 vue.js 上的计算属性中定义的结果的函数的问题
- shell - 如何用 awk 处理最后一个命令的结果?
- arrays - 如何在 TypeScript 中定义具有交替类型的数组?
- c++ - 检查 radixsort C++ 的内存使用情况