使用一个查询数据框中的索引和列在另一数据框中创建新列

时间:2020-04-29 19:37:40

标签: pandas dataframe

我有一个用于查找值的数据框:

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'])

enter image description here

然后有另一个数据框,我想根据rw2数据框中的数据获取'p'值:

df = pd.DataFrame(columns=['location','income','p'])
df['location'] = ['city','city','suburbs','rural','rural']
df['income'] = ['low','med','high','v-high','med']

enter image description here

我期望的是:

enter image description here

可以使用for循环,但它是熊猫的反模式,我认为应该有更好的方法。

for i in np.arange(df.shape[0]):
    df['p'][i] = rw2.loc[df['income'][i],df['location'][i]]

另一种可能性是编写很长的np.where(...逻辑,但是感觉也不对,而且伸缩性也不太好。

2 个答案:

答案 0 :(得分:1)

您可以在stackrw2上分别使用reindexdf的列收入和位置,例如:

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

enter image description here

第二步:

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

enter image description here

Step3:

result = pd.merge(df, rw2_melt, on=['location', 'income'], how='left').drop(columns='p_x').rename(columns={'p_y':'p'})
result

enter image description here