Объединение нескольких таблиц с помощью Index в Python

У меня есть два фрейма данных:

  1. DF1
РСпеременная1переменная2переменная3переменная4
МС1абкомпакт дискэфгх
МС2ijабкл-
МС3компакт дискгхэф-
  1. дф2
Аниабкомпакт дискэфгхijкл
Лев0,1NaN0,50,610,4
Тигр0,40,12NaN0,14NaN0,3
Собака2NaN0,40,80,40,12

Используя оба из них, итоговая таблица будет создана:

АниРСВарЦенность
ЛевМС1аб0,1
ЛевМС1компакт диск0
ЛевМС1эф0,5
ЛевМС1гх0,6
ЛевМС2ij1
ЛевМС2аб0,1
ЛевМС2кл0,4
ЛевМС3компакт диск0
ЛевМС3гх0,6
ЛевМС3эф0,5
ТигрМС1аб0,4
ТигрМС1компакт диск0
ТигрМС1эф0,5
ТигрМС1гх0,14
ТигрМС2ij0
ТигрМС2аб0,4
ТигрМС2кл0,3
ТигрМС3компакт диск0,12
ТигрМС3гх0,14
ТигрМС3эф0

Я пытаюсь использовать кучу циклов if-else и for, но я считаю, что должен быть эффективный способ сделать это, любая помощь будет высоко оценена.

можешь описать логику?

mozway 04.05.2022 16:08
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
35
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

IIUC, вот как добиться своих результатов. Во-первых, .melt() оба фрейма данных, как показано ниже:

ДФ1:

DF1_melt = DF1.melt(id_vars='MS', value_name='Variable')[['MS', 'Variable']]

Из:

     MS variable
0   MS1       ab
1   MS2       ij
2   MS3       cd
3   MS1       cd
4   MS2       ab
5   MS3       gh
6   MS1       ef
7   MS2       kl
8   MS3       ef
9   MS1       gh
10  MS2      NaN
11  MS3      NaN

ДФ2:

DF2_melt = DF2.melt(id_vars='Ani', var_name='Variable')

Из:

      Ani variable  value
0    Lion       ab   0.10
1   Tiger       ab   0.40
2     Dog       ab   2.00
3    Lion       cd    NaN
4   Tiger       cd   0.12
5     Dog       cd    NaN
6    Lion       ef   0.50
7   Tiger       ef    NaN
8     Dog       ef   0.40
9    Lion       gh   0.60
10  Tiger       gh   0.14
11    Dog       gh   0.80
12   Lion       ij   1.00
13  Tiger       ij    NaN
14    Dog       ij   0.40
15   Lion       kl   0.40
16  Tiger       kl   0.30
17    Dog       kl   0.12

Затем вы можете объединить их и заполнить Nan 0:

DF_new = DF1_melt.merge(DF2_melt, on='Variable', how='inner').fillna(0)[['Ani', 'MS', 'Variable', 'value']]

Из:

     Ani   MS Variable  value
0    Lion  MS1       ab   0.10
1   Tiger  MS1       ab   0.40
2     Dog  MS1       ab   2.00
3    Lion  MS2       ab   0.10
4   Tiger  MS2       ab   0.40
5     Dog  MS2       ab   2.00
6    Lion  MS2       ij   1.00
7   Tiger  MS2       ij   0.00
8     Dog  MS2       ij   0.40
9    Lion  MS3       cd   0.00
10  Tiger  MS3       cd   0.12
11    Dog  MS3       cd   0.00
12   Lion  MS1       cd   0.00
13  Tiger  MS1       cd   0.12
14    Dog  MS1       cd   0.00
15   Lion  MS3       gh   0.60
16  Tiger  MS3       gh   0.14
17    Dog  MS3       gh   0.80
18   Lion  MS1       gh   0.60
19  Tiger  MS1       gh   0.14
20    Dog  MS1       gh   0.80
21   Lion  MS1       ef   0.50
22  Tiger  MS1       ef   0.00
23    Dog  MS1       ef   0.40
24   Lion  MS3       ef   0.50
25  Tiger  MS3       ef   0.00
26    Dog  MS3       ef   0.40
27   Lion  MS2       kl   0.40
28  Tiger  MS2       kl   0.30
29    Dog  MS2       kl   0.12

Затем вы можете сортировать/переименовывать/переупорядочивать столбцы в соответствии с вашим вопросом. Непонятно, почему в выводе нет собаки, но можно отредактировать, если ее там быть не должно.

вы можете напрямую установить имена значений/переменных в melt;)

mozway 04.05.2022 16:21

Хорошо подмечено, спасибо! Обновил :)

Emi OB 04.05.2022 16:27

Логика непонятна, но если я правильно понял, вы хотите melt и merge:

(df2.melt('Ani', var_name='Var').fillna({'value': 0})
    .merge(df1.melt('MS', value_name='Var')
              .drop(columns='variable')
              .query('Var != "-"'),
           on='Var'
          )
    .sort_values(by=['Ani', 'MS'], kind='stable')
)

выход:

      Ani Var  value   MS
0     Dog  ab   2.00  MS1
1     Dog  cd   0.00  MS1
2     Dog  ef   0.40  MS1
3     Dog  gh   0.80  MS1
4     Dog  ab   2.00  MS2
5     Dog  ij   0.40  MS2
6     Dog  kl   0.12  MS2
7     Dog  cd   0.00  MS3
8     Dog  ef   0.40  MS3
9     Dog  gh   0.80  MS3
10   Lion  ab   0.10  MS1
11   Lion  cd   0.00  MS1
12   Lion  ef   0.50  MS1
13   Lion  gh   0.60  MS1
14   Lion  ab   0.10  MS2
15   Lion  ij   1.00  MS2
16   Lion  kl   0.40  MS2
17   Lion  cd   0.00  MS3
18   Lion  ef   0.50  MS3
19   Lion  gh   0.60  MS3
20  Tiger  ab   0.40  MS1
21  Tiger  cd   0.12  MS1
22  Tiger  ef   0.00  MS1
23  Tiger  gh   0.14  MS1
24  Tiger  ab   0.40  MS2
25  Tiger  ij   0.00  MS2
26  Tiger  kl   0.30  MS2
27  Tiger  cd   0.12  MS3
28  Tiger  ef   0.00  MS3
29  Tiger  gh   0.14  MS3

Другие вопросы по теме