web-dev-qa-db-fra.com

Application d'une fonction avec plusieurs arguments pour créer une nouvelle colonne pandas

Je souhaite créer une nouvelle colonne dans un cadre de données pandas en appliquant une fonction à deux colonnes existantes. Suite à cela réponse J'ai été capable de créer une nouvelle colonne alors que je n'ai besoin que d'une colonne comme argument:

import pandas as pd
df = pd.DataFrame({"A": [10,20,30], "B": [20, 30, 10]})

def fx(x):
    return x * x

print(df)
df['newcolumn'] = df.A.apply(fx)
print(df)

Cependant, je ne peux pas comprendre comment faire la même chose lorsque la fonction nécessite plusieurs arguments. Par exemple, comment créer une nouvelle colonne en transmettant les colonnes A et B à la fonction ci-dessous?

def fxy(x, y):
    return x * y
129
Michael

Alternativement, vous pouvez utiliser la fonction sous-jacente numpy:

>>> import numpy as np
>>> df = pd.DataFrame({"A": [10,20,30], "B": [20, 30, 10]})
>>> df['new_column'] = np.multiply(df['A'], df['B'])
>>> df
    A   B  new_column
0  10  20         200
1  20  30         600
2  30  10         300

ou vectoriser une fonction arbitraire dans le cas général:

>>> def fx(x, y):
...     return x*y
...
>>> df['new_column'] = np.vectorize(fx)(df['A'], df['B'])
>>> df
    A   B  new_column
0  10  20         200
1  20  30         600
2  30  10         300
118
alko

Vous pouvez choisir l'exemple @greenAfrican, s'il vous est possible de réécrire votre fonction. Mais si vous ne voulez pas réécrire votre fonction, vous pouvez l'envelopper dans une fonction anonyme à l'intérieur de l'application, comme ceci:

>>> def fxy(x, y):
...     return x * y

>>> df['newcolumn'] = df.apply(lambda x: fxy(x['A'], x['B']), axis=1)
>>> df
    A   B  newcolumn
0  10  20        200
1  20  30        600
2  30  10        300
184
Roman Pekar

Cela résout le problème:

df['newcolumn'] = df.A * df.B

Vous pouvez aussi faire:

def fab(row):
  return row['A'] * row['B']

df['newcolumn'] = df.apply(fab, axis=1)
33
greenafrican

Si vous avez besoin de créer plusieurs colonnes à la fois :

  1. Créez le dataframe:

    import pandas as pd
    df = pd.DataFrame({"A": [10,20,30], "B": [20, 30, 10]})
    
  2. Créez la fonction:

    def fab(row):                                                  
        return row['A'] * row['B'], row['A'] + row['B']
    
  3. Assignez les nouvelles colonnes:

    df['newcolumn'], df['newcolumn2'] = Zip(*df.apply(fab, axis=1))
    
18
toto_tico

ne autre syntaxe pure de style dict:

df["new_column"] = df.apply(lambda x: x["A"] * x["B"], axis = 1)

ou,

df["new_column"] = df["A"] * df["B"]
13
Surya