Sostituisci tutti i valori numerici in un frame di dati pyspark con un valore costante


12

Si consideri un frame di dati pyspark costituito da elementi "null" ed elementi numerici. In generale, gli elementi numerici hanno valori diversi. Come è possibile sostituire tutti i valori numerici del frame di dati con un valore numerico costante (ad esempio il valore 1)? Grazie in anticipo!

Esempio per il frame di dati pyspark:

c1c2c310.0411.3521null1.23null1.2null

Il risultato dovrebbe essere:

c1c2c3111121null13null1null

Benvenuti in SO! Potresti pubblicare alcuni dati e / o esempi di codice in modo che possiamo aiutarti meglio?
Stereo

Risposte:


8

L'utilizzo litconvertirà tutti i valori della colonna nel valore dato.

Per farlo solo per valori non nulli di dataframe, dovresti filtrare i valori non nulli di ogni colonna e sostituire il tuo valore. whenpuò aiutarti a raggiungere questo obiettivo.

from pyspark.sql.functions import when   

df.withColumn('c1', when(df.c1.isNotNull(), 1))
  .withColumn('c2', when(df.c2.isNotNull(), 1))
  .withColumn('c3', when(df.c3.isNotNull(), 1))

Ciò comporterebbe:

c1c2c3111121null13null1null

Inoltre, se si desidera sostituire quei valori null anche con qualche altro valore, è possibile utilizzare otherwisein combinazione con when. Diciamo che vuoi imputare 0lì:

from pyspark.sql.functions import when   

df.withColumn('c1', when(df.c1.isNotNull(), 1).otherwise(0))
  .withColumn('c2', when(df.c2.isNotNull(), 1).otherwise(0))
  .withColumn('c3', when(df.c3.isNotNull(), 1).otherwise(0))

Ciò comporterebbe:

c1c2c3111121013010

7

Secondo il tuo problema, penso che potrebbe essere più facile da usare illuminato . Prova questo-

from pyspark.sql.functions import lit
new_df = df.withColumn('column_name', lit(1))

Spero che sia d'aiuto!


2

Questo sarebbe più semplice se hai più colonne:

from pyspark.sql.functions import when   
cols = df.columns # list of all columns
for col in cols:
    df= df.withColumn(col, when(df[col]>0,1).otherwise(0))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.