, так что это будет не очень эффективно.

ель - объединить столбцы в кадре данных (источник) на основе пар, которые описаны в отдельном кадре данных (ссылка). Результирующий кадр данных должен заменить заголовки столбцов в источнике на метки индекса в справочнике.

Фрейм данных, используемый для ссылок, выглядит следующим образом:
df1 = pd.DataFrame(dict(
    FIRST=['Alpha', 'Alpha', 'Charlie'],
    SECOND=['Bravo', 'Delta', 'Delta']
), ['H1', 'H2', 'H3'])

df1

      FIRST SECOND
H1    Alpha  Bravo
H2    Alpha  Delta
H3  Charlie  Delta
Фрейм данных, используемый в качестве источника данных:
df2 = pd.DataFrame(dict(
    Alpha=['A', 'C'],
    Bravo=['A', 'C'],
    Delta=['T', 'C'],
    Charlie=['T', 'G']
), ['item-000', 'item-111'])

df2

           Alpha Bravo Charlie Delta
item-000     A     A       T     T
item-111     C     C       G     C
Как будет выглядеть итоговый кадр данных:
          H1  H2  H3
item-000  AA  AT  TT
item-111  CC  CC  GC

Вопрос
Возможно ли это с текущей настройкой, или было бы лучше изменить форму, в которой находятся данные?

Ответы на вопрос(2)

Решение Вопроса

Решение
С помощьюpd.get_dummies а такжеpd.DataFrame.dot


          H1  H2  H3
item-000  AA  AT  TT
item-111  CC  CC  GC

объяснение

Я знаю, что хочу использовать точечный продукт. Правило с умножением матрицы состоит в том, чтоn x k матрица, умноженная наk x m Матрица приводит кn x m матрица. Глядя на конечный результат, я вижу['item-000', 'item-111'] в индексе, это моеn в моемn x k матрица. Я смотрю на мои предварительные кадры данных, есть ли у меня с['item-000', 'item-111'] в столбцах или в индексе? Я делаю!

df2

           Alpha Bravo Charlie Delta
item-000     A     A       T     T
item-111     C     C       G     C

и это подразумевает мойk является['Alpha', 'Bravo', 'Charlie', 'Delta'], Хорошо, теперь я должен искатьk x m, Единственный другой фрейм данных у меня естьdf1 и вещи, которые похожи['Alpha', 'Bravo', 'Charlie', 'Delta'] в ценностях ...не столбцы или индекс. Так что я должен получить это там. Я решил сложитьdf1 и использоватьpd.get_dummies.

pd.get_dummies(df1.stack())

           Alpha  Bravo  Charlie  Delta
H1 FIRST       1      0        0      0
   SECOND      0      1        0      0
H2 FIRST       1      0        0      0
   SECOND      0      0        0      1
H3 FIRST       0      0        1      0
   SECOND      0      0        0      1

И теперь у меня есть['Alpha', 'Bravo', 'Charlie', 'Delta'] в моих колонках! Это моеk, Но мне это нужно в моем индексе. Нет проблем, используйте транспонирование.

pd.get_dummies(df1.stack()).T

           H1           H2           H3       
        FIRST SECOND FIRST SECOND FIRST SECOND
Alpha       1      0     1      0     0      0
Bravo       0      1     0      0     0      0
Charlie     0      0     0      0     1      0
Delta       0      0     0      1     0      1

Право на! Теперь я готовdot

df2.dot(pd.get_dummies(df1.stack()).T)

            H1           H2           H3       
         FIRST SECOND FIRST SECOND FIRST SECOND
item-000     A      A     A      T     T      T
item-111     C      C     C      C     G      C

Мы почти на месте. Я соединяюFIRST а такжеSECOND используяpd.DataFrame.sum где я указываю, что я хочу суммировать по строкам и сгруппированы по первому уровню объекта столбцов.



          H1  H2  H3
item-000  AA  AT  TT
item-111  CC  CC  GC

Настроить

df1 = pd.DataFrame(dict(
    FIRST=['Alpha', 'Alpha', 'Charlie'],
    SECOND=['Bravo', 'Delta', 'Delta']
), ['H1', 'H2', 'H3'])

df2 = pd.DataFrame(dict(
    Alpha=['A', 'C'],
    Bravo=['A', 'C'],
    Delta=['T', 'C'],
    Charlie=['T', 'G']
), ['item-000', 'item-111'])
 coldspeed06 окт. 2017 г., 03:43
Попытка понять, что здесь происходит ... и не удалась. Замечательно, как всегда.
 MaxU06 окт. 2017 г., 16:58
Вау! это умно!
 piRSquared06 окт. 2017 г., 16:58
Спасибо @MaxU! Мне просто очень понравилось, как все это сочетается.

import pandas as pd

df1 = pd.DataFrame({'FIRST': pd.Series(['Alpha', 'Alpha', 'Charlie'],
                                       index=['H1', 'H2',  'H3']),
                    'SECOND': pd.Series(['Bravo', 'Delta', 'Delta'],
                                        index=['H1', 'H2', 'H3'])})

df2 = pd.DataFrame({'Alpha' : pd.Series(['A', 'C'], index = ['item-000', 'item-111']),
                    'Bravo' : pd.Series(['A', 'C'], index = ['item-000', 'item-111']),
                    'Delta' : pd.Series(['T', 'C'], index = ['item-000', 'item-111']),
                    'Charlie' : pd.Series(['T', 'G'], index = ['item-000', 'item-111'])})

pd.concat((df1.T.apply(lambda x: x.map(df2.loc[idx]).str.cat())
           for idx in df2.index),
          axis=1).rename_axis(pd.Series(df2.index), axis=1).T

Out[]:
          H1  H2  H3
item-000  AA  AT  TT
item-111  CC  CC  GC

Конечно, это зависит как отfor цикл в итераторе иapply, так что это будет не очень эффективно.

Ваш ответ на вопрос