我需要根据其中一列中的值有条件地更新数据框中的列。
例如,基于COL9中的值,我希望新列COL10具有值A / B / C(假设基于以下标准)
0.00-0.50 : A
0.51-0.75 : B
0.75-1.00 : C
预期产出:
col1..col8 col9 col10
0 0.788310 0.211690 A
1 0.293871 0.706129 B
2 0.002207 0.997793 C
3 0.047834 0.952166 C
这可以以高效的方式完成吗?
答案 0 :(得分:4)
您可以使用pd.cut()
并按照您想要的方式标记类别:
import pandas as pd
df['col10'] = pd.cut(df['col9'], [0, 0.5, 0.75, 1], labels = list("ABC"))
答案 1 :(得分:1)
这是用户定义函数(UDF)的完美情况。如果您需要更多灵活性(例如,从您输入创建多个列),那么您可以查看transformers。
您的UDF将如下所示:
from pyspark.sql.functions import udf
def colToString(num):
if num >= 0 and num < 0.5: return 'A'
elif num >= 0.5 and num < 0.75: return 'B'
elif num >= 0.75 and num < 1.0: return 'C'
else: return 'D'
myUdf = udf(colToString, StringType())
df.withColumn("col10", myUdf('col9'))
这里,myUdf
接受一个double参数并返回一个字符串。从输入列col9
读取double值。
关键是使用数据帧操作来执行此操作,而不是Pandas。 Pandas不会以分布式方式执行您的操作,而Spark会。
答案 2 :(得分:1)
虽然使用pandas数据帧有一个非常好的答案,但是你在标签中提到pyspark我认为你的意思是火花数据帧?
如果是这样,你可以这样做:
:headers => { 'Content-Type' => 'text/html' }
我假设列的合法值是0-1但是如果你需要明确检查它们,你可以简单地改变条件并添加额外的时间/否则为非法值