2016-12-06 2 views
1

Мне нужно условно обновить столбец в dataframe на основе значений, присутствующих в одном из столбцов.Условное обновление столбца в DataFrame в python

Например, на основе значений в 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 

Можно ли это сделать эффективно?

ответ

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

+0

спасибо ... я использовал:. df2 [ 'col10'] = df2 [ 'col9'] карты (лямбда-х: 'C', если х <0,5 еще 'B', если x <0,75 else 'A') –

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 принимает параметр, который является двойным и возвращает строку. Двойное значение считывается из входного столбца, col9.

Ключом является использование операций с данными, чтобы выполнить это, а не Pandas. Pandas не будет выполнять ваши операции распределенным образом, в то время как Spark будет.

1

Хотя есть очень хороший ответ на использование фреймов данных pandas, так как вы упомянули pyspark в теге, я предполагаю, что вы имеете в виду световые информационные кадры?

Если так что вы можете сделать что-то вроде этого:

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")) 

Я предположил, корректные значения для столбцов 0-1, но если вам нужно явно проверить их можно просто изменить условия и добавить дополнительный когда/в противном случае для недопустимых значений