2016-04-09 6 views
0

Wenn ich einen DF mit Standardabweichungen haben, wie kann ich diese Spalten fallen und vermeiden, dass sie die Verarbeitung oder Se es im Modellbau (in einem halbautomatisch)Spark-Drop colums mit 0 oder NaN

So zum Beispiel I viele fehlenden Werte, Nullen oder NaN

  • finden Spalten mit geringer Korrelation zu

    1. Fund Spalten mit (zum Beispiel pearson) möchte mit den abhängigen var
    2. entfernen Sie alle Spalten aus (1) und zehn niedrigsten von (2)
  • +0

    bezogen https://spark.apache.org/docs/latest/ml-features.html – oluies

    +1

    Können Sie sich erklären? Ihre Frage ist ein wenig mehrdeutig –

    +1

    in Bezug auf (1) können Sie die DataFrameNAFunctions verwenden: http://spark.apache.org/docs/latest/api/scala/#org.apache.spark.sql.DataFrameNaFunctions zB df.na. drop() – eliasah

    Antwort

    1

    Sie könnte so etwas wie diese versuchen, Spalten zu löschen, die null Werte in ihm haben:

    val df = Seq(
        (Option(1),Option(11),None), (Option(2), None, Option(222)) 
    ).toDF("col1", "col2", "col3") 
    
    // +----+----+----+ 
    // |col1|col2|col3| 
    // +----+----+----+ 
    // | 1| 11|null| 
    // | 2|null| 222| 
    // +----+----+----+ 
    
    val nullCount = udf[Int,Any](any => if (any == null) 1 else 0) 
    
    val columnNullCounts = df.select(
        df.columns.map(c => nullCount(col(c)) as c):_* 
    ).agg(
        sum(df.columns(0)) as df.columns(0), 
        df.columns.slice(1, df.columns.length).map(c => sum(c) as c):_* 
    ).collect.apply(0).toSeq.toArray 
    
    df.select(df.columns.zip(columnNullCounts).filter(v => v._2 == 0).map(c => col(c._1)):_*) 
    
    // +----+ 
    // |col1| 
    // +----+ 
    // | 1| 
    // | 2| 
    // +----+ 
    

    Beachten Sie, dass alle großen Komplexität im obigen Code ist, weil ich es generic gemacht mit einem DataFrame zu arbeiten. Es verwendet DataFrame.columns, um seine Abfragen dynamisch zu erstellen. Wenn Sie nicht jede Spalte überprüfen möchten, können Sie sie in harte Codewerte umschreiben - aber das sollte ausreichen, um Sie in Schwung zu bringen.

    +0

    Vielleicht verwenden Sie stattdessen df.stat.freqItems? – oluies

    +0

    Das bringt ihn nicht wirklich, was er will, oder? –