преобразовать данные в 2-режимную сетевую матрицу - PullRequest
1 голос
/ 28 октября 2019

Я сделал игрушечный фрейм для игры, с советами директоров и директорами, которые сидят на этих досках. Цель состоит в том, чтобы создать 2-режимную матрицу из фрейма данных, которую я могу прочитать в UCINET для статистического анализа.

df1 = pd.DataFrame({"Director": ["Dir_A", "Dir_B", "Dir_C", "Dir_D", "Dir_E", "Dir_F", "Dir_E", "Dir_F", "Dir_G","Dir_D"], 
                  "Board": ["Board_W","Board_W","Board_W","Board_X","Board_X","Board_Y","Board_Y","Board_Z","Board_W","Board_W"]})


    Director    Board
0   Dir_A   Board_W
1   Dir_B   Board_W
2   Dir_C   Board_W
3   Dir_D   Board_X
4   Dir_E   Board_X
5   Dir_F   Board_Y
6   Dir_E   Board_Y
7   Dir_F   Board_Z
8   Dir_G   Board_W
9   Dir_D   Board_W

Что мне нужно, так это матрица инцидентности в 2 режимах, например:

        Board_W  Board_X  Board_Y  Board_Z
Dir_A         1        0        0        0
Dir_B         1        0        0        0
Dir_C         1        0        0        0
Dir_D         1        1        0        0
Dir_E         0        1        1        0
Dir_F         0        0        1        1
Dir_G         1        0        0        0

Я даже не уверен, возможно ли такое, но есть ли у кого-тоИдея, что было бы здорово. Или, если нет, по крайней мере, преобразовать его в список краев сети.

1 Ответ

1 голос
/ 28 октября 2019

Я полагаю, вам нужно get_dummies с max по первому уровню для матрицы, заполненной только 0 и 1:

df = pd.get_dummies(df1.set_index('Director')['Board']).max(level=0)
print (df)
          Board_W  Board_X  Board_Y  Board_Z
Director                                    
Dir_A           1        0        0        0
Dir_B           1        0        0        0
Dir_C           1        0        0        0
Dir_D           1        1        0        0
Dir_E           0        1        1        0
Dir_F           0        0        1        1
Dir_G           1        0        0        0

Если используется crosstabэто работает, только если все пары уникальны во входных данных:

 #add first row same like second row - duplicated pair
df1 = pd.DataFrame({"Director": ["Dir_A","Dir_A", "Dir_B", "Dir_C", "Dir_D", 
                                  "Dir_E", "Dir_F", "Dir_E", "Dir_F", "Dir_G","Dir_D"], 
                  "Board": ["Board_W", "Board_W","Board_W","Board_W","Board_X","Board_X",
                            "Board_Y","Board_Y","Board_Z","Board_W","Board_W"]})

df = pd.crosstab(df1['Director'], df1['Board'])
print (df)
Board     Board_W  Board_X  Board_Y  Board_Z
Director                                    
Dir_A           2        0        0        0 <- first values is 2 (because crosstab counts)
Dir_B           1        0        0        0
Dir_C           1        0        0        0
Dir_D           1        1        0        0
Dir_E           0        1        1        0
Dir_F           0        0        1        1
Dir_G           1        0        0        0

#for general data create unique pairs
df1 = df1.drop_duplicates(['Director','Board'])
df = pd.crosstab(df1['Director'], df1['Board'])
print (df)
Board     Board_W  Board_X  Board_Y  Board_Z
Director                                    
Dir_A           1        0        0        0 <- only 0, 1 values
Dir_B           1        0        0        0
Dir_C           1        0        0        0
Dir_D           1        1        0        0
Dir_E           0        1        1        0
Dir_F           0        0        1        1
Dir_G           1        0        0        0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...