Объединение двух независимых кадров данных панд в матрицу - PullRequest
0 голосов
/ 05 февраля 2019

Я хотел бы объединить два фрейма данных панд, чтобы получить матрицу.Два кадра данных не имеют общего значения индекса и действительно являются независимыми.Вместо этого я хочу использовать два набора индексов для создания нового фрейма данных с использованием иерархической индексации, в которой есть все возможные комбинации двух индексов.Столбцы должны принимать значения из исходных фреймов данных.

Вот упрощенная версия двух фреймов данных, которые я хотел бы объединить:

df1         
    Cat Freq
1.1   A    4
1.2   B    8
1.3   C    2
1.4   A    5

df2
    Cat Freq
2.1   A    4
2.2   C    4
2.3   C    2
2.4   A    7

И вот что я хочу создать:

df_merged         
        Cat(1) Freq(1)  Cat(2)   Freq(2)
1.1 2.1  A       4         A       4
    2.2  A       4         C       4
    2.3  A       4         C       2
    2.4  A       4         A       7
1.2 2.1  B       8         A       4
    2.2  B       8         C       4
    2.3  B       8         C       2
 .. ... ....  .......   .......   .......
 .. ... .... ........   .......   .......

В конечном итогеЯ хочу создать новый столбец с буквой категории (взятой из df1 или df2) на основе столбца с максимальной частотой.С этим я смогу сформировать матрицу.Этот последний шаг, я думаю, будет довольно простым, если я смогу получить данные в вышеуказанной форме.

Большое спасибо!

1 Ответ

0 голосов
/ 05 февраля 2019

Используйте reindex как DataFrames, так и MultiIndex, созданный from_product и последний concat с add_suffix:

mux = pd.MultiIndex.from_product([df1.index, df2.index])

df1 = df1.reindex(mux, level=0)
df2 = df2.reindex(mux, level=1)

df = pd.concat([df1.add_suffix('(1)'), df2.add_suffix('(2)')], axis=1)
print (df)
        Cat(1)  Freq(1) Cat(2)  Freq(2)
1.1 2.1      A        4      A        4
    2.2      A        4      C        4
    2.3      A        4      C        2
    2.4      A        4      A        7
1.2 2.1      B        8      A        4
    2.2      B        8      C        4
    2.3      B        8      C        2
    2.4      B        8      A        7
1.3 2.1      C        2      A        4
    2.2      C        2      C        4
    2.3      C        2      C        2
    2.4      C        2      A        7
1.4 2.1      A        5      A        4
    2.2      A        5      C        4
    2.3      A        5      C        2
    2.4      A        5      A        7

Или используйте перекрестное соединение по merge с reset_index, чтобы избежать потери значений индекса:

df = (df1.reset_index().assign(A=1)
        .merge(df2.reset_index().assign(A=1), on='A', suffixes=('(1)','(2)'))
        .set_index(['index(1)','index(2)'])
        .drop('A', axis=1)
        .rename_axis((None,None)))
print (df)
        Cat(1)  Freq(1) Cat(2)  Freq(2)
1.1 2.1      A        4      A        4
    2.2      A        4      C        4
    2.3      A        4      C        2
    2.4      A        4      A        7
1.2 2.1      B        8      A        4
    2.2      B        8      C        4
    2.3      B        8      C        2
    2.4      B        8      A        7
1.3 2.1      C        2      A        4
    2.2      C        2      C        4
    2.3      C        2      C        2
    2.4      C        2      A        7
1.4 2.1      A        5      A        4
    2.2      A        5      C        4
    2.3      A        5      C        2
    2.4      A        5      A        7
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...