2017-09-08 3 views
0

Ich habe einen Datenrahmen alspyspark UDF für mutils Spalten

import pandas as pd 

ndf = pd.DataFrame({'a':[False, False,True,True,False], 'b':[False, False,False,False, True]}) 

ndf_s = sqlContext.createDataFrame(ndf) 

Ich mag würde eine neue Spalte als „Aktion“ genannt bekommen. Dies könnte zwei Werte enthalten, wenn das ndf ['a'] True ist, hat die "action" einen Wert wie "I am a", wenn ndf ['b'] True ist, hat die "action" einen Wert wie "I am b" . Andernfalls erhält der Wert None. Für den Fall, beide Spalte wahr sind, dann Rückgabewert als "I a und b bin" .In anderen Worten würde Ich mag einen Datenrahmen erhalten, wie:

ndf_result = sqlContext.createDataFrame(pd.DataFrame({'a':[False, False,True,True,False], 'b':[False, False,False,False, True], 'action':[None, None, 'I am a', 'I am a', 'I am b']})) 
+0

gibt es eine Chance beiden Spalten wahr sind? – Psidom

+0

möglich, in diesem Fall senden Sie die "Aktion" zu "Ich bin ein und b" –

Antwort

3

Sie when.otherwise verwenden können:

import pyspark.sql.functions as F 

ndf_s.withColumn("action", F.when(
     ndf_s["a"] & ndf_s["b"], "I am a and b" 
    ).otherwise(
     F.when(
      ndf_s["a"], "I am a" 
     ).otherwise(
      F.when(ndf_s["b"], "I am b") 
     ) 
    ) 
).show() 
+-----+-----+------------+ 
| a| b|  action| 
+-----+-----+------------+ 
| true| true|I am a and b| 
|false|false|  null| 
| true|false|  I am a| 
| true|false|  I am a| 
|false| true|  I am b| 
+-----+-----+------------+ 

Eine weitere Option mit udf:

import pyspark.sql.functions as F 

@F.udf 
def action(col_a, col_b): 
    if col_a and col_b: 
     return "I am a and b" 
    elif col_a: 
     return "I am a" 
    elif col_b: 
     return "I am b" 

ndf_s.withColumn("action", action(ndf_s["a"], ndf_s["b"])).show() 
+-----+-----+------------+ 
| a| b|  action| 
+-----+-----+------------+ 
| true| true|I am a and b| 
|false|false|  null| 
| true|false|  I am a| 
| true|false|  I am a| 
|false| true|  I am b| 
+-----+-----+------------+ 
+0

Hallo @Psidom, danke für Ihre nette Lösung! Gibt es Änderungen an "udf", um dieses Ergebnis zu erreichen? –

+0

Sie können 'udf' dafür verwenden, wenn die Bedingung kompliziert ist, eine Option mit' udf' aktualisiert. – Psidom

+0

Abendessen! Danke vielmals ! –

Verwandte Themen