python中DataFrame中列的条件更新

python中DataFrame中列的条件更新,python,dataframe,conditional,pyspark,Python,Dataframe,Conditional,Pyspark,我需要根据其中一列中的值有条件地更新dataframe中的一列 例如,基于COL9中的值,我希望新列COL10具有值a/B/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.952

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

例如,基于COL9中的值,我希望新列COL10具有值a/B/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
能否以高效的方式实现这一点?

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

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

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

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

这是用户定义函数(UDF)的理想情况。如果您需要更多的灵活性(例如,从您的输入创建多个列),那么您可以查看

您的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'))
从pyspark.sql.functions导入udf
def冷管串(数量):
如果num>=0且num<0.5:返回“A”
elif num>=0.5且num<0.75:返回“B”
elif num>=0.75且num<1.0:返回“C”
其他:返回'D'
myUdf=udf(colToString,StringType())
df.withColumn(“col10”,myUdf(“col9”))
这里,
myUdf
接受一个双精度参数并返回一个字符串。从输入列中读取双精度值,
col9


关键是要使用数据帧操作来执行此操作,而不是熊猫。Pandas不会以分布式方式执行您的操作,而Spark会。

这是用户定义函数(UDF)的理想情况。如果您需要更多的灵活性(例如,从您的输入创建多个列),那么您可以查看

您的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'))
从pyspark.sql.functions导入udf
def冷管串(数量):
如果num>=0且num<0.5:返回“A”
elif num>=0.5且num<0.75:返回“B”
elif num>=0.75且num<1.0:返回“C”
其他:返回'D'
myUdf=udf(colToString,StringType())
df.withColumn(“col10”,myUdf(“col9”))
这里,
myUdf
接受一个双精度参数并返回一个字符串。从输入列中读取双精度值,
col9


关键是要使用数据帧操作来执行此操作,而不是熊猫。Pandas不会以分布式方式执行您的操作,而Spark会。

使用Pandas数据帧有一个很好的答案,因为您在标签中提到了pyspark,我想您是指Spark数据帧

如果是这样,您可以这样做:

import pyspark.sql.functions.when,lit

newDF = df.withColumn("col10", when(df["col9"] < 0.5, lit("A")).otherwise(when(df["col9"] > 0.75, lit("C")).otherwise(lit("B"))
导入pyspark.sql.functions.when,点亮
newDF=df.withColumn(“col10”),当(df[“col9”]<0.5,点亮(“A”)。否则(df[“col9”]>0.75,点亮(“C”)。否则(点亮(“B”))

我假设列的合法值为0-1,但如果您需要显式检查它们,您可以简单地更改条件,并为非法值添加一个额外的when/other

,而使用pandas dataframes有一个非常好的答案,因为您在标记中提到了pyspark,我假设您是指spark dataframes

如果是这样,您可以这样做:

import pyspark.sql.functions.when,lit

newDF = df.withColumn("col10", when(df["col9"] < 0.5, lit("A")).otherwise(when(df["col9"] > 0.75, lit("C")).otherwise(lit("B"))
导入pyspark.sql.functions.when,点亮
newDF=df.withColumn(“col10”),当(df[“col9”]<0.5,点亮(“A”)。否则(df[“col9”]>0.75,点亮(“C”)。否则(点亮(“B”))

我假设列的合法值为0-1,但是如果您需要显式地检查它们,您可以简单地更改条件,并为非法值添加一个额外的when/other

谢谢…我使用了:df2['col10']=df2['col9'].map(lambda x:C'if x<0.5 else'B'if x<0.75 else'A')。谢谢…我使用了:df2['col10']=df2['col9'].map(λx:如果x<0.5,则为“C”,如果x<0.75,则为“B”,否则为“A”)