python中DataFrame中的列的条件更新

时间:2016-12-06 14:17:49

标签: python dataframe conditional pyspark

我需要根据其中一列中的值有条件地更新数据框中的列。

例如,基于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

这可以以高效的方式完成吗?

3 个答案:

答案 0 :(得分:4)

您可以使用pd.cut()并按照您想要的方式标记类别:

import pandas as pd
df['col10'] = pd.cut(df['col9'], [0, 0.5, 0.75, 1], labels = list("ABC"))

enter image description here

答案 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但是如果你需要明确检查它们,你可以简单地改变条件并添加额外的时间/否则为非法值