将3个数据帧合并为矩阵

时间:2017-11-27 06:35:39

标签: pandas

我有3个数据帧。

  1. warehouse_to_outlet_distance。

    wh_name   outlet_id    distance
    aaa        111            10
    aaa        222            20
    aaa        333            30
    
  2. outlet_to_outlet_distance

    source_outlet_id   dest_outlet_id    distance
    111                    222           5
    111                    333           7
    222                    111           8
    222                    333           6
    333                    111          10
    333                    222          12
    
  3. outlet_to_warehouse_distance

    outlet_id   wh_name  dist
    111         aaa      13
    222         aaa      15
    333         aaa      11
    
  4. 我希望将其转换为martix:

           0    111      222       333
      0    0     10       20        30       
    111   13      0        5         7
    222   15      8        0         6
    333   11     10       12         0
    

    其中0代表'仓库'
    在第1行中,仓库(0)与出口111之间的距离 10 ,将其放入相应的单元格

1 个答案:

答案 0 :(得分:0)

使用unstackpivot进行重塑,然后添加新行和新列,最后一个排序索引和列名称:

df = outlet_to_outlet_distance.set_index(['source_outlet_id','dest_outlet_id'])['distance']
                              .unstack(fill_value=0)
df[0] = outlet_to_warehouse_distance.set_index('outlet_id')['dist']
#appended 0 Series for avoid NaN in 0,0
df.loc[0] = warehouse_to_outlet_distance.set_index('outlet_id')['distance']
                                        .append(pd.Series(0, index=[0]))
df = df.sort_index().sort_index(axis=1)
df = df.rename_axis(None).rename_axis(None, 1)
print (df)
     0    111  222  333
0      0   10   20   30
111   13    0    5    7
222   15    8    0    6
333   11   10   12    0

替代:

df = outlet_to_outlet_distance.pivot('source_outlet_id','dest_outlet_id', 'distance')
df[0] = outlet_to_warehouse_distance.set_index('outlet_id')['dist']
df.loc[0] = warehouse_to_outlet_distance.set_index('outlet_id')['distance']
df = df.sort_index().sort_index(axis=1).fillna(0).astype(int)
df = df.rename_axis(None).rename_axis(None, 1)
print (df)
     0    111  222  333
0      0   10   20   30
111   13    0    5    7
222   15    8    0    6
333   11   10   12    0