【问题标题】:How do I put values od dataframe column in 2d matrix?如何将数据框列的值放入二维矩阵?
【发布时间】:2018-01-20 15:58:54
【问题描述】:

我有带有 3 列 valuerow_indexcolumn_index 的 pandas 数据框。我想创建一个矩阵,其中放置在相关行和列的数据框的值以及未知元素为零。

我做了一个这样的for循环:

N_rows = df.row_index.max()
N_cols = df.column_index.max()
A = np.zeros((N_rows, N_cols))
for i in df.row_index:
    for j in df.column_index:
        np.put(A, i*N_cols+j, df['value'][(df.row_index==i) & 
                                          (df.column_index==j)])

但运行速度很慢。

我怎样才能更快地做到这一点?

【问题讨论】:

  • 试试array = df.fillna(0).values

标签: pandas numpy matrix dataframe


【解决方案1】:

只是修改@jezrael 解决方案中的一小部分。您实际上可以使用 Pandas as_matrix() 函数来获取数组:

df = pd.DataFrame({'value':[2,4,5],
                   'row_index':[2,3,4],
                   'col_index':[0,2,3]})

df.pivot('row_index', 'col_index', 'value').fillna(0).as_matrix()
# array([[ 2.,  0.,  0.],
#        [ 0.,  4.,  0.],
#        [ 0.,  0.,  5.]])

【讨论】:

    【解决方案2】:

    我认为你需要 pivotfillna 并且对于列和行的缺失值添加 reindex,最后为 numpy 数组添加 values

    df = pd.DataFrame({'value':[2,4,5],
                       'row_index':[2,3,4],
                       'col_index':[0,2,3]})
    
    print (df)
       col_index  row_index  value
    0          0          2      2
    1          2          3      4
    2          3          4      5
    
    rows = np.arange(df.row_index.max()+1)
    cols = np.arange(df.col_index.max()+1)
    
    print (df.pivot('row_index', 'col_index', 'value')
             .fillna(0)
             .reindex(index=rows, columns=cols, fill_value=0))
    col_index    0    1    2    3
    row_index                    
    0          0.0  0.0  0.0  0.0
    1          0.0  0.0  0.0  0.0
    2          2.0  0.0  0.0  0.0
    3          0.0  0.0  4.0  0.0
    4          0.0  0.0  0.0  5.0
    
    a = df.pivot('row_index', 'col_index', 'value')
          .fillna(0)
          .reindex(index=rows, columns=cols, fill_value=0)
          .values
    print (a)
    [[ 0.  0.  0.  0.]
     [ 0.  0.  0.  0.]
     [ 2.  0.  0.  0.]
     [ 0.  0.  4.  0.]
     [ 0.  0.  0.  5.]]
    

    set_indexunstack 的另一种解决方案:

    print (df.set_index(['row_index', 'col_index'])['value']
             .unstack(fill_value=0)
             .reindex(index=rows, columns=cols, fill_value=0))
    
    col_index  0  1  2  3
    row_index            
    0          0  0  0  0
    1          0  0  0  0
    2          2  0  0  0
    3          0  0  4  0
    4          0  0  0  5
    
    
    a = df.set_index(['row_index', 'col_index'])['value']
          .unstack(fill_value=0)
          .reindex(index=rows, columns=cols, fill_value=0)
          .values
    print (a)
     [[0 0 0 0]
     [0 0 0 0]
     [2 0 0 0]
     [0 0 4 0]
     [0 0 0 5]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      • 2021-06-17
      • 1970-01-01
      • 2019-04-19
      • 2021-07-17
      • 2020-03-19
      • 1970-01-01
      相关资源
      最近更新 更多