我有一个用于查找值的数据框:
ruralw2 = [[0.1,0.3,0.5], [0.1,0.2,0.8], [0.1,0.2,0.7], [0.1,0,0.3]]
rw2 = pd.DataFrame(data=ruralw2, columns=['city','suburbs','rural'],index=['low','med','high','v-high'])
然后有另一个数据框,我想根据rw2数据框中的数据获取'p'值:
df = pd.DataFrame(columns=['location','income','p'])
df['location'] = ['city','city','suburbs','rural','rural']
df['income'] = ['low','med','high','v-high','med']
我期望的是:
可以使用for循环,但它是熊猫的反模式,我认为应该有更好的方法。
for i in np.arange(df.shape[0]):
df['p'][i] = rw2.loc[df['income'][i],df['location'][i]]
另一种可能性是编写很长的np.where(...逻辑,但是感觉也不对,而且伸缩性也不太好。
答案 0 :(得分:1)
您可以在stack
和rw2
上分别使用reindex
和df
的列收入和位置,例如:
df['p'] = rw2.stack().reindex(df[['income', 'location']]).to_numpy()
location income p
0 city low 0.1
1 city med 0.1
2 suburbs high 0.2
3 rural v-high 0.3
4 rural med 0.8
答案 1 :(得分:0)
您可以使用reset_index
将收入值带入数据框,然后使用pd.melt
将其重新构建为结果格式。然后,您可以将此新数据框与df
第1步:
rw2_reset = rw2.reset_index()
rw2_reset
第二步:
rw2_melt = pd.melt(rw2_reset, id_vars='index', value_vars=['city', 'suburbs', 'rural'])
rw2_melt.rename(columns={'index':'income', 'variable':'location','value':'p'}, inplace=True)
rw2_melt
Step3:
result = pd.merge(df, rw2_melt, on=['location', 'income'], how='left').drop(columns='p_x').rename(columns={'p_y':'p'})
result