Применение функции с несколькими аргументами для создания нового столбца 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
Ответы
Ответ 1
В качестве альтернативы вы можете использовать базовую функцию 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
Ответ 2
Вы можете использовать пример @greenAfrican, если это возможно, чтобы вы могли переписать свою функцию. Но если вы не хотите переписывать свою функцию, вы можете включить ее в анонимную функцию внутри, например:
>>> 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
Ответ 3
Это решает проблему:
df['newcolumn'] = df.A * df.B
Вы также можете сделать:
def fab(row):
return row['A'] * row['B']
df['newcolumn'] = df.apply(fab, axis=1)
Ответ 4
Еще один четкий синтаксис стиля стиля:
df["new_column"] = df.apply(lambda x: x["A"] * x["B"], axis = 1)
или,
df["new_column"] = df["A"] * df["B"]
Ответ 5
Если вам нужно создать сразу несколько столбцов:
-
Создайте фрейм данных:
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))