Python 使用apply和lambda在收集值的数据帧中进行迭代

Python 使用apply和lambda在收集值的数据帧中进行迭代,python,pandas,Python,Pandas,我的例子是虚构的。我想用apply()和lambda来解决这个问题,尽管我也尝试过iterrows(),但运气不佳。我试图向df2添加一列,该列根据每个df2行中的“项”组合查找df1中的值。提前感谢你的帮助 import pandas as pd import numpy as np import random names= ['A', 'B', 'C', 'D', 'E'] df1 = pd.DataFrame( np.arange(25).reshape(5,5), columns =

我的例子是虚构的。我想用apply()和lambda来解决这个问题,尽管我也尝试过iterrows(),但运气不佳。我试图向df2添加一列,该列根据每个df2行中的“项”组合查找df1中的值。提前感谢你的帮助

import pandas as pd
import numpy as np
import random

names= ['A', 'B', 'C', 'D', 'E']

df1 = pd.DataFrame( np.arange(25).reshape(5,5), columns = names, index = names)

n=5
data = {'Item 1' : random.sample(names, n),
        'Item 2' : random.sample(names, n)}
df2 = pd.DataFrame(data)

#I can't get this to work. 
df2['New'] = df2.apply(lambda x: df1.loc[df2.loc[x, 'Item 1'], df2.loc[x, 'Item 2']], axis=1)

#Since this works, I assume my error with apply and lambda.  Thanks.
x=2
df1.loc[df2.loc[x, 'Item 1'], df2.loc[x, 'Item 2']]

输出:

>>> df2
  Item 1 Item 2  new
0      D      A   15
1      B      B    6
2      A      D    3
3      E      C   22
4      C      E   14

这就是你想要的吗?如果不是,请添加您想要查看的示例输出。

我一般避免使用
apply
,特别是在lambda函数中使用
loc
调用。随着时间的推移,这将变得非常缓慢

改用
numpy
的矢量化:

r = df2['Item 1'].map(dict(zip(df1.index, np.arange(len(df1.index)))))
c = df2['Item 2'].map(dict(zip(df1.columns, np.arange(len(df1.columns)))))

df2['new'] = df1.to_numpy()[r, c]

对这很好。非常感谢你。我移动了几次支架,但没有看到。括号内的内容可能会令人困惑。除了lambda之外,我只使用了df2.loc[x,‘Item 1’]谢谢。它看起来不错,可以帮助我扩展技能。我试过了,但由于出现错误,必须使用较旧的版本,“DataFrame”对象没有“to numpy”属性,因为它是用于类的,所以我坚持使用该版本。@Glenn使用
。value
而不是
to numpy()
。这样就行了。我使用
apply
loc
获得了正确答案,与上述解决方案相同。再次感谢您的跟进。老实说,我现在对
apply
loc
比较满意,但我完全理解您关于效率的观点。“我需要更深入地研究这一行,以完全采纳这种想法。”“格伦:是的,这是正确的答案。但我的是矢量化,这要快得多(对于更大的数据集)。这就是关键区别:p@rafaelc我好久没见到你了,很高兴看到这个矢量化解决方案;)
r = df2['Item 1'].map(dict(zip(df1.index, np.arange(len(df1.index)))))
c = df2['Item 2'].map(dict(zip(df1.columns, np.arange(len(df1.columns)))))

df2['new'] = df1.to_numpy()[r, c]