Ich versuche, eine neue Spalte im pyspark-Datenrahmen zu erstellen. Ich habe folgende Daten
+------+
|letter|
+------+
| A|
| C|
| A|
| Z|
| E|
+------+
Ich möchte eine neue Spalte basierend auf der angegebenen Spalte gemäß hinzufügen
+------+-----+
|letter|group|
+------+-----+
| A| c1|
| B| c1|
| F| c2|
| G| c2|
| I| c3|
+------+-----+
Es kann mehrere Kategorien mit vielen einzelnen Buchstabenwerten geben (etwa 100, die auch mehrere Buchstaben enthalten).
Ich habe das mit udf gemacht und gut gearbeitet
from pyspark.sql.functions import udf
from pyspark.sql.types import *
c1 = ['A','B','C','D']
c2 = ['E','F','G','H']
c3 = ['I','J','K','L']
...
def l2c(value):
if value in c1: return 'c1'
elif value in c2: return 'c2'
elif value in c3: return 'c3'
else: return "na"
udf_l2c = udf(l2c, StringType())
data_with_category = data.withColumn("group", udf_l2c("letter"))
Jetzt versuche ich es ohne zu tun udf
. Vielleicht mit when
und col
. Was ich versucht habe, folgt. Es funktioniert, aber sehr langer Code.
data_with_category = data.withColumn('group', when(col('letter') == 'A' ,'c1')
.when(col('letter') == 'B', 'c1')
.when(col('letter') == 'F', 'c2')
...
Ich bin nicht sehr gut darin, neue Bedingungen für alle möglichen Buchstabenwerte zu schreiben. Die Anzahl der Buchstaben kann in meinem Fall sehr groß sein (ungefähr 100). Also habe ich es versucht
data_with_category = data.withColumn('group', when(col('letter') in ['A','B','C','D'] ,'c1')
.when(col('letter') in ['E','F','G','H'], 'c2')
.when(col('letter') in ['I','J','K','L'], 'c3')
Aber es gibt einen Fehler zurück. Wie kann ich das lösen?
Verwenden Sie isin .
c1 = ['A','B','C','D']
c2 =['E','F','G','H']
c3 =['I','J','K','L']
df.withColumn("group", F.when(F.col("letter").isin(c1),F.lit('c1'))\
.when(F.col("letter").isin(c2),F.lit('c2'))\
.when(F.col("letter").isin(c3),F.lit('c3'))).show()
#+------+-----+
#|letter|group|
#+------+-----+
#| A| c1|
#| B| c1|
#| F| c2|
#| G| c2|
#| I| c3|
#+------+-----+
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen