Добрый день. У меня есть два набора данных (df1, df2). Я пытаюсь заполнить столбец "значения" в df2, используя столбец "site_before" в качестве индекса строки в df1 и столбец "site" в качестве индекса столбца в df1.
Набор данных df1:
ANA01 PHO01 ATL BAL12 BOS07
ANA01 0 0 3 3 3
PHO01 0 0 3 3 3
ATL -3 -3 0 0 0
BAL12 -3 -3 0 0 0
BOS07 -3 -3 0 0 0
"Первый столбец - это индексы строк"
Набор данных df2:
Game_ID site_before site values
1 ANA199804010 ANA01 ANA01
3 ANA199804020 ANA01 ATL
5 ANA199804030 ANA01 BAL12
7 ANA199804040 ANA01 BOS07
9 ANA199804050 ANA01 ANA01
674 BOS199804300 BOS07 BOS07
31 ANA199805010 BOS07 ANA01
33 ANA199805020 PHO01 ANA01
35 ANA199805030 PHO01 PHO01
37 ANA199805040 PHO01 ATL
39 ANA199805050 PHO01 BAL12
Я пытался сделать:
df2['values'] = df1.loc[df2['site_before'], df2['site']].values
но я получил сообщение об ошибке ValueError: неверное количество элементов прошло 4864, размещение подразумевает 1
Результат, который я ожидаю:
Game_ID site_before site values
1 ANA199804010 ANA01 ANA01 0
3 ANA199804020 ANA01 ATL 3
5 ANA199804030 ANA01 BAL12 3
7 ANA199804040 ANA01 BOS07 3
9 ANA199804050 ANA01 ANA01 0
674 BOS199804300 BOS07 BOS07 0
31 ANA199805010 BOS07 ANA01 -3
33 ANA199805020 PHO01 ANA01 0
35 ANA199805030 PHO01 PHO01 0
37 ANA199805040 PHO01 ATL 3
39 ANA199805050 PHO01 BAL12 3
Используйте DataFrame.join
с новой MultiIndex Series
созданной DataFrame.stack
:
df2 = df2.join(df1.stack().rename('new').rename_axis(('site_before','site')),
on=['site_before','site'])
print (df2)
Game_ID site_before site new
1 ANA199804010 ANA01 ANA01 0
3 ANA199804020 ANA01 ATL 3
5 ANA199804030 ANA01 BAL12 3
7 ANA199804040 ANA01 BOS07 3
9 ANA199804050 ANA01 ANA01 0
674 BOS199804300 BOS07 BOS07 0
31 ANA199805010 BOS07 ANA01 -3
33 ANA199805020 PHO01 ANA01 0
35 ANA199805030 PHO01 PHO01 0
37 ANA199805040 PHO01 ATL 3
39 ANA199805050 PHO01 BAL12 3
Альтернативой является использование DataFrame.melt
с DataFrame.merge
и левое соединение:
df3 = df1.rename_axis('site_before').reset_index().melt('site_before', var_name='site')
df2 = df2.merge(df3, how='left')
print (df2)
Game_ID site_before site new
0 ANA199804010 ANA01 ANA01 0
1 ANA199804020 ANA01 ATL 3
2 ANA199804030 ANA01 BAL12 3
3 ANA199804040 ANA01 BOS07 3
4 ANA199804050 ANA01 ANA01 0
5 BOS199804300 BOS07 BOS07 0
6 ANA199805010 BOS07 ANA01 -3
7 ANA199805020 PHO01 ANA01 0
8 ANA199805030 PHO01 PHO01 0
9 ANA199805040 PHO01 ATL 3
10 ANA199805050 PHO01 BAL12 3