Как применить функцию к каждой строке на кадре данных?

Я новичок в Python, и я не уверен, как решить следующую проблему.

У меня есть функция:

def EOQ(D,p,ck,ch):
    Q = math.sqrt((2*D*ck)/(ch*p))
    return Q

Скажем, у меня есть dataframe

df = pd.DataFrame({"D": [10,20,30], "p": [20, 30, 10]})

    D   p
0   10  20
1   20  30
2   30  10

ch=0.2
ck=5

И ch и ck являются типами float. Теперь я хочу применить формулу к каждой строке на кадре данных и вернуть ее как дополнительную строку "Q". Пример (который не работает):

df['Q']= map(lambda p, D: EOQ(D,p,ck,ch),df['p'], df['D']) 

(возвращает только типы 'map')

Мне понадобится этот тип обработки больше в моем проекте, и я надеюсь найти что-то, что работает.

Ответы

Ответ 1

Следующее должно работать:

def EOQ(D,p,ck,ch):
    Q = math.sqrt((2*D*ck)/(ch*p))
    return Q
ch=0.2
ck=5
df['Q'] = df.apply(lambda row: EOQ(row['D'], row['p'], ck, ch), axis=1)
df

Если все, что вы делаете, это вычисление квадратного корня некоторого результата, тогда используйте метод np.sqrt который векторизован и будет значительно быстрее:

In [80]:
df['Q'] = np.sqrt((2*df['D']*ck)/(ch*df['p']))

df
Out[80]:
    D   p          Q
0  10  20   5.000000
1  20  30   5.773503
2  30  10  12.247449

Задержки

Для 30k строки DF:

In [92]:

import math
ch=0.2
ck=5
def EOQ(D,p,ck,ch):
    Q = math.sqrt((2*D*ck)/(ch*p))
    return Q

%timeit np.sqrt((2*df['D']*ck)/(ch*df['p']))
%timeit df.apply(lambda row: EOQ(row['D'], row['p'], ck, ch), axis=1)
1000 loops, best of 3: 622 µs per loop
1 loops, best of 3: 1.19 s per loop

Вы можете видеть, что метод np быстрее на 1900 X

Ответ 2

Я согласен с ответом EdChum. Более общий подход:

def RowWiseOperation(x):
    if x.ExistingColumn1 in x.ExistingColumn.split(','):
       return value1
    else:
       return value2

YourDataFrame['NewColumn'] = YourDataFrame.apply(RowWiseOperation, axis = 1)