使用DataFrame映射另一DataFrame列名的船舶分配问题咨询
嘿,我看你在做船舶分配问题的研究,用两个0-1的Pandas DataFrame来关联缓冲区、槽位和船舶对吧?刚好可以用buffers_slots来完成对slots_vessels列标签的映射翻译,我给你一步步拆解怎么做:
用
buffers_slots映射slots_vessels列标签的步骤 1. 先提取缓冲区与槽位的对应关系
因为buffers_slots每行求和为1,意味着每个缓冲区唯一对应一个槽位。我们可以直接提取每行值为1的列名,就是该缓冲区绑定的槽位:
# 生成缓冲区→槽位的映射Series,索引是Buffer名称,值是对应槽位号 buffer_to_slot = buffers_slots.idxmax(axis=1)
比如你的示例里,Buffer #24对应的槽位就是8,这个Series会把所有缓冲区的对应关系都存下来。
2. 根据需求翻译slots_vessels的列标签
接下来分两种常见场景处理:
场景1:slots_vessels的列是槽位号,要替换为对应的缓冲区名称
如果slots_vessels的列是槽位(比如5、7、8这类),我们需要先反转映射关系,得到槽位→缓冲区的对应表,再重命名列:
# 反转映射:槽位号 → 对应的缓冲区名称 slot_to_buffer = buffer_to_slot.reset_index().set_index(0)['index'] # 重命名slots_vessels的列 slots_vessels_renamed = slots_vessels.rename(columns=slot_to_buffer)
注意:如果一个槽位对应多个缓冲区(比如多个缓冲区都在同一个槽位制备),上面的代码会保留最后一个匹配的缓冲区。如果想把同一个槽位的所有缓冲区列出来,可以用分组聚合:
# 把同一槽位的缓冲区合并成列表 slot_to_buffer = buffer_to_slot.groupby(buffer_to_slot).agg(list) # 重命名列时把列表转成逗号分隔的字符串 slots_vessels_renamed = slots_vessels.rename( columns=lambda slot: ', '.join(slot_to_buffer.get(slot, [str(slot)])) )
场景2:slots_vessels的行索引是槽位号,要替换为缓冲区名称
如果slots_vessels的行是按槽位划分的,直接用映射替换索引就行:
slots_vessels_renamed = slots_vessels.rename(index=buffer_to_slot)
3. 验证映射结果
最后可以打印处理后的DataFrame,确认标签是否正确映射:
print(slots_vessels_renamed.head())
内容的提问来源于stack exchange,提问作者multipitch
相关产品推荐
相关产品推荐

