我正在尝试找到进行n维表查找的最佳方法。在这个例子中,有一个数据框包含一个人的状态和年份,我想通过在表格中查找相关的税率(可能是数组,数据框或字典)。首先,考虑通过数组来实现:
nobs = 4
df = DataFrame( { 'state' : np.tile( [ 'tx', 'ny'], nobs/2 ),
'year' : np.tile( [ 2008, 2008, 2009, 2009 ], nobs/4 ) } )
dct = { 'tx':0, 'ny':1 }
# rows are 2008 and 2009, columns are 'tx' and 'ny'
rate_arr = np.array( [[.05,.06],
[.08,.09]] )
df['rate1'] = rate_arr[ df.year-2008, df.state.map(dct) ]
state year rate1
0 tx 2008 0.05
1 ny 2008 0.06
2 tx 2009 0.08
3 ny 2009 0.09
以上就是我想要的,我只想看看是否有更好的方法。比如,标记numpy数组的任何好方法?
使用数据框作为查找似乎可以让我自动转换状态和年份值,但我只能将其用于一个维度,而不是两个维度:
rate_df = DataFrame( { 2008: [ .05, .06 ],
2009: [ .08, .09 ] } , index=(['tx','ny']) )
# doesn't work
df['rate3'] = rate_df[ df.year, df.state ]
或者,也许是嵌套字典?同样,我可以让它在一个维度而不是两个维度中运行:
rate_dict = { 'tx': { 2008: .05, 2009: .08 },
'ny': { 2008: .06, 2009: .09 } }
# doesn't work
df['rate2'] = df.year.map( df.state.map(rate_dict) )
答案 0 :(得分:2)
您正在寻找lookup
:
In [21]: rate_df.lookup(df['state'], df['year'])
Out[21]: array([ 0.05, 0.06, 0.08, 0.09])
In [22]: df['rate2'] = res.lookup(df['state'], df['year'])
In [23]: df
Out[23]:
state year rate1 rate2
0 tx 2008 0.05 0.05
1 ny 2008 0.06 0.06
2 tx 2009 0.08 0.08
3 ny 2009 0.09 0.09
注意:您可以指定索引和列,以便从numpy数组中获取标记的DataFrame:
In [11]: rate_df = pd.DataFrame(rate_arr.T, index=['tx', 'ny'], columns=[2008, 2009])
In [12]: rate_df
Out[12]:
2008 2009
tx 0.05 0.08
ny 0.06 0.09
更新:我需要转移numpy数组,以便rate_df
正确定位。