【问题标题】:Pandas: occurrence matrix from one hot encoding from pandas dataframePandas:来自 pandas 数据帧的一种热编码的出现矩阵
【发布时间】:2020-03-12 05:44:06
【问题描述】:

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

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

如何直接从一个热数据帧中获取出现矩阵?

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 一个问题,得到这个矩阵后,如果我想改变列的顺序,假设我想要像 [d,c,a,b] 这样的矩阵列而不是 [a,b,c, d] 如何重新索引?
    • @AadityaUra 执行以下操作:o = ['d', 'c', 'a', 'b']; df[o].T.dot(df[o]) * ~u
    猜你喜欢
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 2017-05-02
    • 2021-12-17
    • 2021-04-15
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    相关资源
    最近更新 更多