python - 在熊猫中创建具有 0,1,0.5 值而不是布尔值的列
问题描述
考虑这个数据框:
id Name Score
314 John 100
345 Sara 200
355 Zack 200
333 Harry 50
334 Chad 50
331 Newton 100
我想根据 score 将自定义值分配给新的运算符列,因此如果一个分数小于下一个分数,则为 1,如果大于 0,如果保持不变则为 0.5。这就是我想要的样子:
id Name Score Operator
314 John 100 1
345 Sara 200 0.5
355 Zack 200 0
333 Harry 50 0.5
334 Chad 50 1
331 Newton 100 NAN
我尝试了差异列和布尔列的组合,但它没有提供任何摆脱二进制方法的访问权限
解决方案
首先,设置您的条件:
prev = df.Score.shift(-1)
c1, c2, c3 = df.Score.lt(prev), df.Score.eq(prev), df.Score.gt(prev)
现在使用numpy.select
:
out = df.assign(out=np.select([c1, c2, c3], [1, 0.5, 0], np.nan))
id Name Score out
0 314 John 100 1.0
1 345 Sara 200 0.5
2 355 Zack 200 0.0
3 333 Harry 50 0.5
4 334 Chad 50 1.0
5 331 Newton 100 NaN
这是另一种只是为了好玩的解决方案(仅当您的差异永远不小于 时才有效0.5
):
df.Score.diff(-1).mul(-1).add(0.5).clip(0, 1)
0 1.0
1 0.5
2 0.0
3 0.5
4 1.0
5 NaN
Name: Score, dtype: float64
推荐阅读
- java - 将字符串从 EditText 保存到 SQLite
- amazon-web-services - 如何在 CDN 上同时提供静态 HTML 和资产并拥有友好的 URL
- redis - Redis XRANGE:ERR 指定为流命令参数的流 ID 无效
- r - 如何将列拆分为包含原始数据框中的列的数据框?
- azure - 我们能否将 Azure 蓝图分配给资源或资源组
- python - 更好的 python unittest 集成?
- javascript - 如何将所选颜色设置为笔颜色?
- multithreading - Camunda dmnEngine 的无状态使用是线程安全的吗?
- mongodb - 为什么用户可以看到所有数据库
- highcharts - 在 HighMaps 上,如何在美国地图上显示州缩写而不是州名并从点中删除数据标签