Применение функции 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