我有一个pyspark数据框
| ID|colA|colB |colC|
+---+----+-----+----+
|ID1| 3|5.85 | LB|
|ID2| 4|12.67| RF|
|ID3| 2|20.78| LCM|
|ID4| 1| 2 | LWB|
|ID5| 6| 3 | LF|
|ID6| 7| 4 | LM|
|ID7| 8| 5 | RS|
+---+----+----+----+
我的目标是将colc中的值替换为lb、lwb、lf的值,以此类推,如下所示。
x = [LB,LWB,LF]
y = [RF,LCM]
z = [LM,RS]
目前,我可以通过手动替换以下代码中的每个值来实现这一点:
# Replacing the values LB,LWF,LF with x
df_new = df.withColumn('ColC',f.when((f.col('ColC') == 'LB')|(f.col('ColC') == 'LWB')|(f.col('ColC') == 'LF'),'x').otherwise(df.ColC))
我这里的问题是,我们如何通过使用pyspark一次动态遍历列表(x,y,z)来替换列的值(在我的示例中是colc)?所涉及的时间复杂性是什么?另外,如何将colb中的十进制值截断为1个十进位?
4条答案
按热度按时间nbysray51#
你可以
coalesce
这个when
如果你有很多条件要匹配的话。还可以使用字典保存要转换的列,并构造when
动态地使用dict理解语句。至于四舍五入到小数点后1位,你可以用round
.sigwle7e2#
你可以用
replace
在dataframe上替换colC
通过传递Map的dict对象。以及round
函数来限制colB
:unhi4e5o3#
您还可以使用isin函数:
如果你有几个列表中有太多的值,那么你的复杂性比blackbishop答案要小,但在这个问题上,他的答案更简单。
fafcakar4#
您还可以使用regexp\u replace尝试使用正则表达式: