【问题标题】:Modify matrix df format修改矩阵df格式
【发布时间】:2017-08-14 16:53:51
【问题描述】:

有一个 df 为:

    14       15         16
14  10.1166  18.2331    65.0185
15  18.2331  6.664      57.5195
16  65.3499  57.851     20.9907

有什么更有效的方法来修改 df 以使其看起来像

   a   b   c
0  14  14  10.1166
1  14  15  18.2331
2  14  16  65.0185
3  15  14  18.2331
4  15  15  6.664 
etc.

我写了这段代码,但我不喜欢我需要为它使用循环的事实。

for row in tt.index:
    row_vals = tt[tt.index==row]
    col_vals = row_vals.T
    col_vals['from_zone'] = row
    col_vals['to_zone'] = tt.index
    col_vals['travel_time'] = col_vals[row].astype('int')
    col_vals = col_vals.drop(row, axis=1)
    travel_data = pd.concat([travel_data,col_vals])

【问题讨论】:

    标签: python pandas dataframe unpivot


    【解决方案1】:
    In [58]: df.stack().reset_index().rename(columns={'level_0':'a','level_1':'b',0:'c'})
    Out[58]:
        a   b        c
    0  14  14  10.1166
    1  14  15  18.2331
    2  14  16  65.0185
    3  15  14  18.2331
    4  15  15   6.6640
    5  15  16  57.5195
    6  16  14  65.3499
    7  16  15  57.8510
    8  16  16  20.9907
    

    一步一步:

    In [59]: df.stack()
    Out[59]:
    14  14    10.1166
        15    18.2331
        16    65.0185
    15  14    18.2331
        15     6.6640
        16    57.5195
    16  14    65.3499
        15    57.8510
        16    20.9907
    dtype: float64
    
    In [60]: df.stack().reset_index()
    Out[60]:
       level_0 level_1        0
    0       14      14  10.1166
    1       14      15  18.2331
    2       14      16  65.0185
    3       15      14  18.2331
    4       15      15   6.6640
    5       15      16  57.5195
    6       16      14  65.3499
    7       16      15  57.8510
    8       16      16  20.9907
    

    【讨论】:

      【解决方案2】:

      使用stackrename 作为列名

      In [620]: df.stack().reset_index(name='c').rename(columns={'level_0': 'a', 'level_1': 'b'})
      Out[620]:
          a   b        c
      0  14  14  10.1166
      1  14  15  18.2331
      2  14  16  65.0185
      3  15  14  18.2331
      4  15  15   6.6640
      5  15  16  57.5195
      6  16  14  65.3499
      7  16  15  57.8510
      8  16  16  20.9907
      

      【讨论】:

        【解决方案3】:

        让我们使用rename_axisreset_indexmelt

        df.rename_axis('a').reset_index().melt(id_vars='a',var_name='b',value_name='c')
        

        输出:

            a   b        c
        0  14  14  10.1166
        1  15  14  18.2331
        2  16  14  65.3499
        3  14  15  18.2331
        4  15  15   6.6640
        5  16  15  57.8510
        6  14  16  65.0185
        7  15  16  57.5195
        8  16  16  20.9907
        

        【讨论】:

          猜你喜欢
          • 2016-06-02
          • 1970-01-01
          • 1970-01-01
          • 2023-03-10
          • 2020-03-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-02-03
          相关资源
          最近更新 更多