我有3个数据帧。
warehouse_to_outlet_distance。
wh_name outlet_id distance
aaa 111 10
aaa 222 20
aaa 333 30
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
outlet_to_warehouse_distance
outlet_id wh_name dist
111 aaa 13
222 aaa 15
333 aaa 11
我希望将其转换为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 ,将其放入相应的单元格
答案 0 :(得分:0)
使用unstack
或pivot
进行重塑,然后添加新行和新列,最后一个排序索引和列名称:
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