Pandas lookup/pivot с использованием заголовков столбцов

63
5

У меня есть таблица, содержащая идентификаторы водоразделов и классы по растительному покрову:

WatershedID LandCover
2 Corn
8 Corn
2 Soy
8 Soy

и отдельную таблицу поиска, которая содержит область для каждой комбинации водораздела/растительного покрова:

WatershedID  Corn  Soy
2 14 1
3 2 14
5 18 8
7 21 2
8 6 31

То, что я хотел бы сделать, - добавить столбец в первую таблицу, которая содержит соответствующее значение строки/столбца в таблице поиска, например:

WatershedID LandCover   Area
2 Corn 14
8 Corn 6
2 Soy 1
8 Soy 31

Мне удалось это сделать, перебирая цикл for:

areas = []
for watershed_id, land_cover in tableA.iterrows():
areas.append(tableB.loc[watershed_id][land_cover]

но, учитывая размер моих таблиц, это медленно. Есть ли более быстрый способ сделать это, не связанный с итерацией? Я экспериментировал с MultiIndexing и сводными таблицами, но до сих пор ничего не работало.

спросил(а) 2021-01-19T16:11:40+03:00 6 месяцев, 1 неделя назад
1
Решение
78

Вы можете использовать unstack merge:

df3 = df2.set_index('WatershedID').unstack().reset_index()
df3.columns = ['LandCover','WatershedID','Area']
print (df3)
LandCover WatershedID Area
0 Corn 2 14
1 Corn 3 2
2 Corn 5 18
3 Corn 7 21
4 Corn 8 6
5 Soy 2 1
6 Soy 3 14
7 Soy 5 8
8 Soy 7 2
9 Soy 8 31

print (pd.merge(df1,df3))
WatershedID LandCover Area
0 2 Corn 14
1 8 Corn 6
2 2 Soy 1
3 8 Soy 31

Если есть более одинаковые столбцы, вам нужно указать столбцы для соединения:

print (pd.merge(df1,df3, on=['WatershedID','LandCover']))
WatershedID LandCover Area
0 2 Corn 14
1 8 Corn 6
2 2 Soy 1
3 8 Soy 31

ответил(а) 2021-01-19T16:11:40+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема