Python 使用apply和lambda在收集值的数据帧中进行迭代
我的例子是虚构的。我想用apply()和lambda来解决这个问题,尽管我也尝试过iterrows(),但运气不佳。我试图向df2添加一列,该列根据每个df2行中的“项”组合查找df1中的值。提前感谢你的帮助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 =
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]