2016-05-07 10 views
3

Gibt es eine präzise funktionale Möglichkeit, Spalten eines Deedle-Datenrahmens f umzubenennen?Eine einfache Funktion zum Umbenennen von Spalten eines Deedle-Datenrahmens

f.RenameColumns(...) ist verwendbar, aber mutiert den Datenrahmen, auf den es angewendet wird, so ist es ein wenig mühsam, den Umbenennungsvorgang idempotent zu machen. Ich habe so etwas wie f.RenameColumns (fun c -> (if c.IndexOf("_") < 0 then c else c.Substring(0, c.IndexOf("_"))) + "_renamed"), was hässlich ist.

Was wäre schön, ist etwas, das einen neuen Rahmen aus dem Eingangsrahmen schafft, wie folgt aus: Frame(f |> Frame.cols |> Series.keys |> Seq.map someRenamingFunction, f |> Frame.cols |> Series.values) aber dies wird durch den zweiten Teil gestolpert - die Art der f |> Frame.cols |> Series.values ist nicht das, was durch den Frame Konstruktor erforderlich ist.

Wie kann ich f |> Frame.cols |> Series.values prägnant so transformieren, dass das Ergebnis vom Frame Konstruktor genießbar ist?

Antwort

2

Sie ihre Funktion bestimmen kann, wann mit RenameColumns verwendet:

df.RenameColumns someRenamingFunction 

Sie können auch die Funktion Frame.mapColKeys verwenden.

Erstellt einen neuen Datenrahmen, dessen Spalten die Ergebnisse der Anwendung der angegebenen Funktion auf die Spalten des Eingabedatenrahmens sind. Die -Funktion wird mit dem Spaltenschlüssel und der Objektserie aufgerufen, die die Spaltendaten darstellt. Source

Beispiel:

type Record = {Name:string; ID:int ; Amount:int} 

let data = 
    [| 
     {Name = "Joe";  ID = 51; Amount = 50};  
     {Name = "Tomas"; ID = 52; Amount = 100}; 
     {Name = "Eve";  ID = 65; Amount = 20}; 
    |] 

let df = Frame.ofRecords data 

let someRenamingFunction s = 
    sprintf "%s(%i)" s s.Length 

df.Format() |> printfn "%s" 

let ndf = df |> Frame.mapColKeys someRenamingFunction 

ndf.Format() |> printfn "%s" 

df.RenameColumns someRenamingFunction 

df.Format() |> printfn "%s" 

Druck:

 Name ID Amount 
0 -> Joe 51 50 
1 -> Tomas 52 100 
2 -> Eve 65 20 

    Name(4) ID(2) Amount(6) 
0 -> Joe  51 50 
1 -> Tomas 52 100 
2 -> Eve  65 20 

    Name(4) ID(2) Amount(6) 
0 -> Joe  51 50 
1 -> Tomas 52 100 
2 -> Eve  65 20 
+1

Ausgezeichnet, danke. Wie immer ist es nur eine Frage von mir, nicht gründlich genug zu suchen, was in der Bibliothek verfügbar ist, und die Funktionsnamen stimmen nicht genau mit dem überein, was ich zu finden erwartet habe (obwohl 'mapColKeys' sehr gut beschreibend ist). Wenn überhaupt, hoffe ich, dass diese Frage/Antwort für Leute auftaucht, die google "_ deedle data frame rename columns" _, da die aktuellen Ergebnisse mager sind. – mt99