首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何根据数据中的条件设置新的列表值?

如何根据数据中的条件设置新的列表值?
EN

Stack Overflow用户
提问于 2017-12-18 13:15:48
回答 2查看 2K关注 0票数 0

我有一个像下面这样的DataFrame。

代码语言:javascript
运行
复制
+---+------------------------------------------+
|id |features                                  |
+---+------------------------------------------+
|1  |[6.629056, 0.26771536, 0.79063195,0.8923] |
|2  |[1.4850719, 0.66458416, -2.1034079]       |
|3  |[3.0975454, 1.571849, 1.9053307]          |
|4  |[2.526619, -0.33559006, -1.4565022]       |
|5  |[-0.9286196, -0.57326394, 4.481531]       |
|6  |[3.594114, 1.3512149, 1.6967168]          |
+---+------------------------------------------+

我想根据我的where条件设置一些特性值,如下所示。即id=1id=2id=6

我想在其中设置新的特性值id=1,我当前的功能值是[6.629056, 0.26771536, 0.79063195,0.8923],但是我想设置[0,0,0,0]

我想在其中设置新的特性值id=2,我当前的功能值是[1.4850719, 0.66458416, -2.1034079],但是我想设置[0,0,0]

我的最终结果是:

代码语言:javascript
运行
复制
+------+-----------------------------------+
|id  | features                            |
+-----+---------------------------------- -+
|1  | [0, 0, 0, 0]                          |
|2  | [0,0,0]                              |
|3  | [3.0975454, 1.571849, 1.9053307]     |
|4  | [2.526619, -0.33559006, -1.4565022]  |
|5  | [-0.9286196, -0.57326394, 4.481531]  |
|6  | [0,0,0]                              |
+-----+------------------------------------+
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-18 13:45:53

如果您有一组有限的id,并且知道相应的feature的长度,那么Shaido的回答是很好的。

如果不是这样,那么使用UDF应该更干净,您想要转换的id可以加载到另一个Seq中:

中的Scala

代码语言:javascript
运行
复制
val arr = Seq(1,2,6)

val fillArray = udf { (id: Int, array: WrappedArray[Double] ) =>
                        if (arr.contains(id) ) Seq.fill[Double](array.length)(0.0) 
                        else array 
                     }

df.withColumn("new_features" , fillArray($"id", $"features") ).show(false)

Python中的

代码语言:javascript
运行
复制
from pyspark.sql import functions as f
from pyspark.sql.types import *

arr = [1,2,6]

def fillArray(id, features):
    if(id in arr): return [0.0] * len(features)
    else : return features

fill_array_udf = f.udf(fillArray, ArrayType( DoubleType() ) )

 df.withColumn("new_features" , fill_array_udf( f.col("id"), f.col("features") ) ).show()

输出

代码语言:javascript
运行
复制
+---+------------------------------------------+-----------------------------------+
|id |features                                  |new_features                       |
+---+------------------------------------------+-----------------------------------+
|1  |[6.629056, 0.26771536, 0.79063195, 0.8923]|[0.0, 0.0, 0.0, 0.0]               |
|2  |[1.4850719, 0.66458416, -2.1034079]       |[0.0, 0.0, 0.0]                    |
|3  |[3.0975454, 1.571849, 1.9053307]          |[3.0975454, 1.571849, 1.9053307]   |
|4  |[2.526619, -0.33559006, -1.4565022]       |[2.526619, -0.33559006, -1.4565022]|
|5  |[-0.9286196, -0.57326394, 4.481531]       |[-0.9286196, -0.57326394, 4.481531]|
|6  |[3.594114, 1.3512149, 1.6967168]          |[0.0, 0.0, 0.0]                    |
+---+------------------------------------------+-----------------------------------+
票数 3
EN

Stack Overflow用户

发布于 2017-12-18 13:25:59

如果您有一组要更改的if,请使用whenotherwise

代码语言:javascript
运行
复制
df.withColumn("features", 
  when(df.id === 1, array(lit(0), lit(0), lit(0), lit(0)))
  .when(df.id === 2 | df.id === 6, array(lit(0), lit(0), lit(0)))
  .otherwise(df.features)))

它应该比UDF更快,但是如果有许多It需要更改,那么它很快就会变成很多代码。在这种情况下,使用一个UDF,就像在philantrovert的答案中一样。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47869332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档