Распутывание DataFrame - PullRequest
       2

Распутывание DataFrame

0 голосов
/ 16 января 2019

Мне нужно преобразовать df в antoher, будучи оригиналом (df1), вот так:

           value
    A--A     4     
    A--B     2     
    A--C     1    
    B--B     2    
    C--C     3    
    D--B     2    
    E--E     6    

Тогда у меня есть другой df2, заполненный 0:

        A    B    C    D    E
    A   0    0    0    0    0
    B   0    0    0    0    0
    C   0    0    0    0    0
    D   0    0    0    0    0
    E   0    0    0    0    0
    F   0    0    0    0    0
    G   0    0    0    0    0

Мне нужно преобразовать его в конечный df3, получая значения из пар в индексе из df1, разделенных "-", и заполнить его так:

        A    B    C    D    E
    A   4    2    1    0    0
    B   2    2    0    2    0
    C   1    0    3    0    0
    D   0    2    0    0    0
    E   0    0    0    0    6
    F   0    0    0    0    0
    G   0    0    0    0    0

В pd2 могут быть пары, которых нет в pd1. В этом случае он остается с 0. Любые предложения ??

1 Ответ

0 голосов
/ 16 января 2019

Вы можете создать это из df самого себя. Сначала установите df.index на MultiIndex, используя str.split, а затем unstack и reindex.

df.index = pd.MultiIndex.from_arrays(zip(*df.index.str.split('--')))
(df['value'].unstack()
            .reindex(index=df2.index, columns=df2.columns)
            .fillna(0, downcast='infer'))

   A  B  C  D  E
A  4  2  1  0  0
B  0  2  0  0  0
C  0  0  3  0  0
D  0  2  0  0  0
E  0  0  0  0  6
F  0  0  0  0  0
G  0  0  0  0  0

Если вы знаете, какие строки и столбцы вы хотите использовать, вам даже не понадобится df2.

(df['value'].unstack()
            .reindex(index=list('ABCDEFG'), columns=list('ABCDE'))
            .fillna(0, downcast='infer'))

   A  B  C  D  E
A  4  2  1  0  0
B  0  2  0  0  0
C  0  0  3  0  0
D  0  2  0  0  0
E  0  0  0  0  6
F  0  0  0  0  0
G  0  0  0  0  0

Согласно комментарию OP, для поддержания симметричности, используйте поворот вашей таблицы, чтобы сохранить NaN, затем fillna с транспонированием:

v = (df['value'].unstack()
                .reindex(index=df2.index, columns=df2.columns))
v.fillna(v.T.reindex_like(v)).fillna(0, downcast='infer')

   A  B  C  D  E
A  4  2  1  0  0
B  2  2  0  2  0
C  1  0  3  0  0
D  0  2  0  0  0
E  0  0  0  0  6
F  0  0  0  0  0
G  0  0  0  0  0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...