Применение функции с несколькими аргументами для создания нового столбца 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
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)
Если вам нужно создать несколько столбцов сразу:
создать таблицы данных:
import pandas as pd df = pd.DataFrame({"A": [10,20,30], "B": [20, 30, 10]})создать функции:
def fab(row): return row['A'] * row['B'], row['A'] + row['B']добавить новые столбцы:
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