Используйте индекс и столбец из одного поискового фрейма данных, чтобы создать новый столбец в другом фрейме данных. - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть фрейм данных для поиска значений:

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

, а затем у меня есть другой фрейм данных, куда я хочу получить 'p 'значения, основанные на данных в кадре данных rw2:

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

Можно использовать для l oop, но это антипаттерн в Pandas, и я думаю, что должен быть лучший способ.

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

Другая возможность состоит в том, чтобы пишите очень долго np.where (... logi c, но это тоже не правильно и не будет очень масштабируемым.

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

вы можете использовать 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
0 голосов
/ 29 апреля 2020

Вы можете использовать reset_index для переноса значений дохода в фрейм данных, а затем pd.melt для его реструктуризации в формате результатов. Затем вы можете объединить этот новый фрейм данных с df

Шаг 1:

rw2_reset = rw2.reset_index()
rw2_reset

enter image description here

Шаг 2:

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

Шаг 3:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...