Применение функции с несколькими аргументами для создания нового столбца pandas



Я хочу создать новый столбец в pandas фрейм данных путем применения функции к двум существующим столбцам. После этого ответа я смог создать новый столбец, когда мне нужен только один столбец в качестве аргумента:



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)


однако я не могу понять, как сделать то же самое, когда функция требует нескольких аргументов. Например, как создать новый столбец, передав столбец A и столбец B в функцию ниже?



def fxy(x, y):
return x * y
1363   5  

5 ответов:

кроме того, вы можете использовать базовую функцию 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

или векторизовать произвольную функцию в общем случае:

>>> 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

вы можете пойти с @greenAfrican пример, если это возможно для вас, чтобы переписать функцию. Но если вы не хотите переписывать свою функцию, вы можете обернуть ее в анонимную функцию внутри apply, например:

>>> 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

Это решает проблему:

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

вы также можете сделать:

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

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

Если вам нужно создать несколько столбцов сразу:

  1. создать таблицы данных:

    import pandas as pd
    df = pd.DataFrame({"A": [10,20,30], "B": [20, 30, 10]})
    
  2. создать функции:

    def fab(row):                                                  
        return row['A'] * row['B'], row['A'] + row['B']
    
  3. добавить новые столбцы:

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

еще один чистый синтаксис стиля дикт:

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

или

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

Comments

    Ничего не найдено.