熊猫:来自熊猫数据帧的一种热编码的出现矩阵

时间:2019-11-16 04:58:59

标签: python python-3.x pandas numpy correlation

我有一个数据框,它是一种热门格式:

dummy_data = {'a': [0,0,1,0],'b': [1,1,1,0], 'c': [0,1,0,1],'d': [1,1,1,0]}
data = pd.DataFrame(dummy_data)

输出:

   a  b  c  d
0  0  1  0  1
1  0  1  1  1
2  1  1  0  1
3  0  0  1  0

我正在尝试从数据框中获取发生矩阵,但是如果我在列表中有列名,而不是像这样的热门列:

raw = [['b','d'],['b','c','d'],['a','b','d'],['c']]
unique_categories = ['a','b','c','d']

然后我能够找到像这样的出现矩阵:

df = pd.DataFrame(raw).stack().rename('val').reset_index().drop(columns='level_1')
df = df.loc[df.val.isin(unique_categories)]

df = df.merge(df, on='level_0').query('val_x != val_y')
final = pd.crosstab(df.val_x, df.val_y)

adj_matrix = (pd.crosstab(df.val_x, df.val_y)
              .reindex(unique_categories, axis=0).reindex(unique_categories, axis=1)).fillna(0)

输出:

val_y  a  b  c  d
val_x            
a      0  1  0  1
b      1  0  1  3
c      0  1  0  1
d      1  3  1  0

如何直接从一个热数据帧获取发生矩阵?

1 个答案:

答案 0 :(得分:1)

您可以从矩阵数学中获得乐趣!


u = np.diag(np.ones(df.shape[1], dtype=bool))

df.T.dot(df) * (~u)

   a  b  c  d
a  0  1  0  1
b  1  0  1  3
c  0  1  0  1
d  1  3  1  0