Les Pandas DataFrame.attribuer des arguments

QUESTION

Comment peut - assign être utilisé pour renvoyer une copie de l'original du DataFrame avec plusieurs colonnes ajoutées?

RÉSULTAT SOUHAITÉ

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

TENTATIVES

L'exemple ci-dessus les résultats dans:

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

FOND

La assign fonction dans les Pandas prend une copie du dataframe rejoint à nouveau la colonne, par exemple

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

La 0.19.2 documentation pour cette fonction implique que plus d'une colonne peut être ajouté à la dataframe.

L'attribution de plusieurs colonnes dans la même attribuer est possible, mais vous ne pouvez pas faire référence à d'autres colonnes créé au sein de la même affecter appel.

En outre:

Paramètres:
kwargs : mot-clé, la valeur des paires

mots-clés sont les noms des colonnes.

Le code source de la fonction qu'il accepte un dictionnaire:

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
Je pense que les docs devrait être plus claire sur la façon de faire ce travail avec plusieurs colonnes pour éviter toute ambiguïté avec un exemple
J'ai refusé de votre tag édition parce que cette question n'a rien à voir avec python. Voir post sur meta. meta.stackoverflow.com/questions/303459/...

OriginalL'auteur Alexander | 2017-02-07