Применение функции apply к data frame c использованием другого data frame

Имеются два массива:

    import pandas as pd
    df = pd.DataFrame({"A": ["foo", "foo", "foo", "foo","bar", "bar", "bar", "bar"],
                       "B": ["one", "one", "one", "two","one", "one", "two", "two"],
                       "D": [1, 2, 2, 3, 4, 5, 6, 7]})

    #     A    B  D
    # 0  foo  one  1
    # 1  foo  one  2
    # 2  foo  one  2
    # 3  foo  two  3
    # 4  bar  one  4
    # 5  bar  one  5
    # 6  bar  two  6
    # 7  bar  two  7


    dfR = pd.DataFrame({"A": ["foo", "bar"],"B": ["bar", "foo"]})

    #     A    B
    # 0  foo  bar
    # 1  bar  foo

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

def sumvect(dfx,one,two):
    dfC = pd.DataFrame({"A": list(dfx.loc[df['A']==one,'D']),"B": list(dfx.loc[df['A']==two,'D'])})
    dfC['U']=dfC['A']-dfC['B']
    return sum(list(dfC['U']))

# print(sumvect(df,'foo','bar')) =>-14
# print(sumvect(df,'bar','foo')) => 14

Однако при применении apply возникает ошибка
dfR['F']=dfR.apply(sumvect,dfx=df ,one='A',two='B' ,axis=1)

TypeError: ("dynamic() got multiple values for argument 'dfx'", 'occurred at index 0'))

Как применить эту функцию к DataFrame?
В случае применения лямбда функции только с одной переменной, результат достигается. 

dfR['w']=dfR['A'].apply(lambda x: sum(list(df.loc[df['A']==x,'D'])))

Как получить результат для исходной задачи?

Ответы (1 шт):

Автор решения: Антон Давыдов
import pandas as pd
df = pd.DataFrame({"A": ["foo", "foo", "foo", "foo","bar", "bar", "bar", "bar"],
                       "B": ["one", "one", "one", "two","one", "one", "two", "two"],
                       "D": [1, 2, 2, 3, 4, 5, 6, 7]})


#     A    B  D
#0  foo  one  1
#1  foo  one  2
#2  foo  one  2
#3  foo  two  3
#4  bar  one  4
#5  bar  one  5
#6  bar  two  6
#7  bar  two  7

dfR = pd.DataFrame({"z": ["foo", "bar"],"y": ["bar", "foo"]})

#     z    y
#0  foo  bar
#1  bar  foo

dfR['F']=(dfR[['z','y']].apply(lambda x: 
((df.loc[df['A']==x['z'],'D'].reset_index(drop=True)- 
 df.loc[df['A']==x['y'],'D'].reset_index(drop=True)).sum()),axis=1))

#     z    y   F
#0  foo  bar -14
#1  bar  foo  14
→ Ссылка