lookup={'Tier':[1,2,3,4],'Terr.1':[0.88,0.83,1.04,1.33],'Terr.2':[0.78,0.82,0.91,1.15],'Terr.3':[0.92,0.98,1.09,1.33],'Terr.4':[1.39,1.49,1.66,1.96],'Terr.5':[1.17,1.24,1.39,1.68]}
df={'Tier':[1,1,2,2,3,2,4,4,4,1],'Territory':[1,3,4,5,4,4,2,1,1,2]}
df=pd.DataFrame(df)
lookup=pd.DataFrame(lookup)
lookup包含查找值,而df包含要馈入iat的数据。
我在打印时得到正确的值(lookup.iat [tier,terr])。但是,当我尝试在新列中设置这些值时,它将无休止地运行,或者在这个简单的测试用例中,仅将1个值复制10次。
for i in df["Tier"]:
tier=i-1
for j in df["Territory"]:
terr=j
#print(lookup.iat[tier,terr])
df["Rate"]=lookup.iat[tier,terr]
是否有更好的解决方案?
答案 0 :(得分:2)
在对apply()
数据框进行一些修改之后,您可以使用lookup
:
lookup = lookup.rename(columns={i: i.split('.')[-1] for i in lookup.columns}).set_index('Tier')
lookup.columns = lookup.columns.astype(int)
df['Rate'] = df.apply(lambda x: lookup.loc[x['Tier'],x['Territory']], axis=1)
返回:
Tier Territory Rate
0 1 1 0.88
1 1 3 0.92
2 2 4 1.49
3 2 5 1.24
4 3 4 1.66
5 2 4 1.49
6 4 2 1.15
7 4 1 1.33
8 4 1 1.33
9 1 2 0.78
答案 1 :(得分:1)
一旦lookup
修改的方式与 @ rahlf23 相同,加上使用stack
,您就可以merge
这两个数据框,例如:
df['Rate'] = df.merge( lookup.rename(columns={ i: int(i.split('.')[-1])
for i in lookup.columns if 'Terr' in i})
.set_index('Tier').stack()
.reset_index().rename(columns={'level_1':'Territory'}),
how='left')[0]
如果您有一个大数据框df
,那么它应该比使用apply
和loc
快
此外,如果(Tier, Territory)
中不存在df
中的任何一对lookup
,则此方法不会引发错误