根据IAT值在数据框中填充列

时间:2018-11-27 19:57:49

标签: python pandas

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]

是否有更好的解决方案?

2 个答案:

答案 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,那么它应该比使用applyloc

此外,如果(Tier, Territory)中不存在df中的任何一对lookup,则此方法不会引发错误