代码之家  ›  专栏  ›  技术社区  ›  Ildar Akhmetov

每组大熊猫关键词对之间的交叉表计数

  •  6
  • Ildar Akhmetov  · 技术社区  · 6 年前

    我有一个与文章相关联的关键字表,如下所示:

    article_id  keyword
    1           A
    1           B
    1           C
    2           A
    2           B
    2           D
    3           E
    3           F
    3           D
    

    我需要一个透视表:

        A   B   C   D   E   F
    A   -   2   1   1   0   0
    B   -   -   1   1   0   0
    C   -   -   -   0   0   0
    D   -   -   -   -   1   1
    E   -   -   -   -   -   1
    F   -   -   -   -   -   -
    

    这意味着,这对 (A, B) 出现在两篇文章中(1和2),这对 (A, C) 仅在一篇文章(1)中发生,等等。

    做那件事最要紧的方法是什么?

    我试过让大熊猫旋转桌子,但到目前为止没有成功。只是不知道如何连接关键字和文章ID。

    这个问题 Create adjacency matrix for two columns in pandas dataframe 不能解决问题。

    3 回复  |  直到 6 年前
        1
  •  7
  •   cs95 abhishek58g    6 年前

    使用 crosstab dot . 然后你可以使用 np.triu 只保留矩阵的上半部分(其他所有内容都设置为0)。

    u = pd.crosstab(df.article_id, df.keyword)
    v = u.T.dot(u)
    pd.DataFrame(np.triu(v, k=1), index=v.index.values, columns=v.columns.values)
    
       A  B  C  D  E  F
    A  0  2  1  1  0  0
    B  0  0  1  1  0  0
    C  0  0  0  0  0  0
    D  0  0  0  0  1  1
    E  0  0  0  0  0  1
    F  0  0  0  0  0  0
    

    或者,对于最后一步,您可以将无效值设置为“-1”,作为对无效值使用“-”的更好选择。

    v.values[np.tril_indices_from(v)] = -1
    print(v)
    
    keyword  A  B  C  D  E  F
    keyword                  
    A       -1  2  1  1  0  0
    B       -1 -1  1  1  0  0
    C       -1 -1 -1  0  0  0
    D       -1 -1 -1 -1  1  1
    E       -1 -1 -1 -1 -1  1
    F       -1 -1 -1 -1 -1 -1
    
        2
  •  3
  •   ayorgo    6 年前

    你也可以用 merge crosstab

    df_merge = df.merge(df, on='article_id')
    pd.crosstab(df_merge['keyword_x'], df_merge['keyword_y'])
    

    合并 pivot_table

    df_merge = df.merge(df, on='article_id')
    df_merge.pivot_table('article_id', 'keyword_x', 'keyword_y', 'count', 0)
    

    两者都会导致

    keyword_y  A  B  C  D  E  F
    keyword_x                  
    A          2  2  1  1  0  0
    B          2  2  1  1  0  0
    C          1  1  1  0  0  0
    D          1  1  0  2  1  1
    E          0  0  0  1  1  1
    F          0  0  0  1  1  1
    
        3
  •  2
  •   Bharath M Shetty    6 年前

    你可以使用 product 在组上使用for循环来增加计数,即

    from itertools import product 
    
    df2 = pd.DataFrame(columns=df['keyword'].unique(),index=df['keyword'].unique()).fillna(0)
    
    
    for i in df.groupby('article_id')['keyword'].apply(lambda x : product(x,x)).values:
        for k,l in i:
            if k==l:
                df2.loc[k,l]='-'
            elif df2.loc[k,l]!=0:
                df2.loc[k,l]+=1
            else:
                df2.loc[k,l]=1
    
    df2 = df2.where((df2=='-').cumsum().T.astype(bool),'-')
    
       A  B  C  D  E  F
    A  -  2  1  1  0  0
    B  -  -  1  1  0  0
    C  -  -  -  0  0  0
    D  -  -  -  -  1  1
    E  -  -  -  -  -  1
    F  -  -  -  -  -  -