【问题标题】:convert dataframe into 2-mode network matrix将数据帧转换为 2 模式网络矩阵
【发布时间】:2019-10-28 06:53:53
【问题描述】:

我制作了一个玩具数据框,供董事会和董事会成员一起玩。目标是从数据帧中创建一个 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

我什至不确定这样的事情是否可能,但如果有人有一个很棒的想法。或者如果不是,至少将其转换为networkx边缘列表。

【问题讨论】:

    标签: python-3.x pandas dataframe networkx


    【解决方案1】:

    我相信你只需要get_dummiesmax 的第一级矩阵由01 填充:

    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
    

    【讨论】:

    • 实际上可行,您的交叉表方法也可行。我很感激。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多