You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将共现矩阵转换为skillid1-skillid2-count三元组DataFrame的方法求助

Convert Co-Occurrence Matrix to 3-Column DataFrame (skillid1, skillid2, count)

Got it, let's break this down into straightforward steps—this is a common task for analyzing skill co-occurrences, and pandas makes it pretty simple.

Step 1: Start with Your Co-Occurrence Matrix

First, let's assume you've already got your co-occurrence matrix stored as a pandas DataFrame (if you're working with a numpy array, I'll cover that too). Here's an example matrix to work with:

import pandas as pd

# Example co-occurrence matrix (rows/columns = skill_id)
cooccurrence_matrix = pd.DataFrame(
    [[0, 5, 3],
     [5, 0, 2],
     [3, 2, 0]],
    index=['skill_1', 'skill_2', 'skill_3'],
    columns=['skill_1', 'skill_2', 'skill_3']
)

Step 2: Use stack() to Reshape the Matrix

The stack() method is the magic here—it converts column labels into a second level of row indices, turning your 2D matrix into a Series with multi-level indices (skillid1, skillid2) and the count as values:

# Stack the matrix into a multi-indexed Series
stacked_series = cooccurrence_matrix.stack()

Step 3: Convert to Your Target DataFrame

Next, reset the index to turn those multi-level indices into regular columns, then rename the columns to match your desired output:

# Convert to DataFrame and rename columns
result_df = stacked_series.reset_index()
result_df.columns = ['skillid1', 'skillid2', 'count']

Optional: Clean Up Edge Cases

Depending on your needs, you might want to tweak the result:

  • Remove self-cooccurrences: If you don't need rows where skillid1 equals skillid2 (e.g., a skill co-occurring with itself), filter those out:
    result_df = result_df[result_df['skillid1'] != result_df['skillid2']]
    
  • Remove duplicate skill pairs: Since co-occurrence matrices are usually symmetric, you'll have both (skillA, skillB) and (skillB, skillA) rows. To keep only unique pairs, filter for cases where skillid1 is "less than" skillid2 (works for string or numeric skill IDs):
    result_df = result_df[result_df['skillid1'] < result_df['skillid2']]
    

If You're Starting with a Numpy Array

If your co-occurrence data is a numpy array instead of a DataFrame, first convert it to a DataFrame using your skill IDs as indices/columns:

import numpy as np

# Example numpy array
skill_ids = ['skill_1', 'skill_2', 'skill_3']
cooccurrence_array = np.array([[0, 5, 3], [5, 0, 2], [3, 2, 0]])

# Convert to DataFrame
cooccurrence_matrix = pd.DataFrame(cooccurrence_array, index=skill_ids, columns=skill_ids)

# Follow steps 2-3 above

That's it—you'll end up with a clean DataFrame with exactly the three columns you need. If you hit any odd edge cases (like non-standard skill IDs or missing values), feel free to adjust the filters or conversion steps!

内容的提问来源于stack exchange,提问作者krits

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:26:46