2013-11-11 5 views
66

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

ответ

59

В качестве альтернативы, вы можете использовать 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

Спасибо за ответ! Мне любопытно, это самое быстрое решение? – MV23

+0

Векнизированная версия с использованием 'np.vectorize()' удивительно быстро. Спасибо. – stackoverflowuser2010

17

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

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

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

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

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

Этот ответ решает эту игрушку пример и будет достаточно для меня, чтобы переписать мою фактическую функцию, но она не рассматривает как применить ранее определенную функцию, не переписывая ее в ссылочные столбцы. – Michael

98

Вы можете пойти с @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 
4

Один ДИКТ стиль чистый синтаксис:

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

или

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

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

  1. Создание dataframe:

    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)) 
    
Смежные вопросы