2017-02-07 4 views
6

FRAGEPandas DataFrame.assign Argumente

Wie kann assign eine Kopie des ursprünglichen Datenrahmen mit mehreren neuen Spalten hinzugefügt zurückzukehren verwendet werden?

gewünschte Ergebnis

df = pd.DataFrame({'A': range(1, 5), 'B': range(11, 15)}) 
>>> df.assign({'C': df.A.apply(lambda x: x ** 2), 'D': df.B * 2}) 
    A B C D 
0 1 11 1 22 
1 2 12 4 24 
2 3 13 9 26 
3 4 14 16 28 

ATTEMPTS

Das obige Beispiel führt zu:

ValueError: Wrong number of items passed 2, placement implies 1.

HINTERGRUND

Die assign Funktion in Pandas eine Kopie des entsprechenden Datenrahmen an die neu zugeordneten Spalte verbunden dauert, z.B.

df = df.assign(C=df.B * 2) 
>>> df 
    A B C 
0 1 11 22 
1 2 12 24 
2 3 13 26 
3 4 14 28 

Die 0.19.2 documentation für diese Funktion impliziert, dass mehr als eine Spalte mit dem Datenrahmen hinzugefügt werden können.

Die Zuweisung mehrerer Spalten innerhalb derselben Zuordnung ist möglich, Sie können jedoch nicht auf andere Spalten verweisen, die innerhalb desselben Zuweisungsaufrufs erstellt wurden.

Zusätzlich:

Parameter:
kwargs: Schlüsselwort Wertepaare

Schlüsselwörter sind die Spaltennamen.

Der Quellcode für die Funktion fest, dass es ein Wörterbuch akzeptiert: kann

def assign(self, **kwargs): 
    """ 
    .. versionadded:: 0.16.0 
    Parameters 
    ---------- 
    kwargs : keyword, value pairs 
     keywords are the column names. If the values are callable, they are computed 
     on the DataFrame and assigned to the new columns. If the values are not callable, 
     (e.g. a Series, scalar, or array), they are simply assigned. 

    Notes 
    ----- 
    Since ``kwargs`` is a dictionary, the order of your 
    arguments may not be preserved. The make things predicatable, 
    the columns are inserted in alphabetical order, at the end of 
    your DataFrame. Assigning multiple columns within the same 
    ``assign`` is possible, but you cannot reference other columns 
    created within the same ``assign`` call. 
    """ 

    data = self.copy() 

    # do all calculations first... 
    results = {} 
    for k, v in kwargs.items(): 

     if callable(v): 
      results[k] = v(data) 
     else: 
      results[k] = v 

    # ... and then assign 
    for k, v in sorted(results.items()): 
     data[k] = v 

    return data 
+3

Ich denke, die docs klarer sein sollte, wie diese Arbeit mit mehreren Spalten machen Mehrdeutigkeit mit einem bereitgestellten Beispiel zu vermeiden – EdChum

Antwort

8

Sie mehrere Spalte erstellen, indem jede neue Spalte als Schlüsselwort Argument an:

df = df.assign(C=df['A']**2, D=df.B*2) 

Ich habe Ihr Beispielwörterbuch funktioniert, indem Sie das Wörterbuch als Schlüsselwortargumente unter Verwendung von **:

entpacken

Es scheint so, als ob assign in der Lage sein sollte, ein Wörterbuch zu verwenden, aber es wird derzeit aufgrund des von Ihnen geposteten Quellcodes nicht unterstützt.

Die resultierende Ausgabe:

A B C D 
0 1 11 1 22 
1 2 12 4 24 
2 3 13 9 26 
3 4 14 16 28 
Verwandte Themen