2016-12-06 6 views
1

Ich muss eine Spalte im Datenrahmen auf der Grundlage von Werten in einer der Spalten bedingt aktualisieren.Bedingte Aktualisierung der Spalte im Datenrahmen in Python

zum Beispiel basierend auf Werten in COL9, möchte ich eine neue Spalte COL10 Werte haben A/B/C (lets auf unter Kriterien sagen)

0.00-0.50 : A 
0.51-0.75 : B 
0.75-1.00 : C 

Erwartete Ausgabe:

 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 

Kann dies in einer leistungsfähigen Weise getan werden?

Antwort

4

können Sie pd.cut() verwenden und beschriften Sie den Kategorien, wie Sie wollten:

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

enter image description here

+0

dank ... I verwendet. df2 [ 'col10'] = df2 [ 'col9'] Karte (lambda x: 'C', wenn x <0,5 else 'B', wenn x <0,75 sonst 'A') –

1

Dies ist eine perfekte Lage für eine benutzerdefinierte Funktion (UDF). Wenn Sie mehr Flexibilität benötigen (z. B. mehr als eine Spalte aus Ihrer Eingabe erstellen), können Sie sich transformers ansehen.

Ihre UDF würde in etwa wie folgt aussehen:

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

Hier myUdf nimmt einen Parameter, der eine doppelt so hoch ist und gibt einen String zurück. Der doppelte Wert wird aus der Eingabespalte col9 gelesen.

Der Schlüssel ist die Verwendung von Datenrahmenoperationen, um dies durchzuführen, nicht Pandas. Pandas werden Ihre Operationen nicht auf verteilte Weise ausführen, während Spark es tun wird.

1

Während es eine sehr gute Antwort für die Verwendung von Pandas-Datenrahmen gibt, da Sie pyspark im Tag erwähnt haben, nehme ich an, Sie meinen Spark Dataframes?

Wenn ja, können Sie etwas tun:

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

I zulässigen Werte für die Spalten angenommen sind 0-1, aber wenn Sie sie explizit überprüfen müssen Sie einfach die Bedingungen ändern und eine zusätzliche hinzuzufügen, wenn/sonst für illegalen Wert

Verwandte Themen