Python While循环以加入panda数据帧

Python While循环以加入panda数据帧,python,pandas,loops,join,while-loop,Python,Pandas,Loops,Join,While Loop,再次感谢您对我的帮助。我有一个数据集,其中包含光纤网络上设备的所有值,从中心节点向下滚动到节点的多个放大器,最后滚动到连接到该节点的所有地址 问题在于节点和地址之间可能存在多个AMP。我正在试图找到每个地址所连接的节点。每个设备(地址、放大器、节点)都有一个ID、设备类型描述和上游设备ID。例如: ID:1 DEVICE_TYPE_DESC:ADDRESS UPSTREAM_DEVICE_ID: 2 ID:2 DEVICE_TYPE_DESC:AMP UPSTREAM_DEVICE_ID:

再次感谢您对我的帮助。我有一个数据集,其中包含光纤网络上设备的所有值,从中心节点向下滚动到节点的多个放大器,最后滚动到连接到该节点的所有地址

问题在于节点和地址之间可能存在多个AMP。我正在试图找到每个地址所连接的节点。每个设备(地址、放大器、节点)都有一个ID、设备类型描述和上游设备ID。例如:

 ID:1 DEVICE_TYPE_DESC:ADDRESS UPSTREAM_DEVICE_ID: 2
 ID:2 DEVICE_TYPE_DESC:AMP UPSTREAM_DEVICE_ID: 3
 ID:3 DEVICE_TYPE_DESC:AMP UPSTREAM_DEVICE_ID: 4
 .....
 ID:10 DEVICE_TYPE_DESC:NODE UPSTREAM_DEVICE_ID: 9
所以我想加入ID:1到ID:10,但要做到这一点,我需要加入到每个放大器之间。我是python新手,所以我不确定我尝试做的事情是否可行,但我正在创建一个while循环,该循环将再次迭代地连接到设备表,并创建一个标志,当连接引入节点时,该标志将更改为1,当节点_标志之和=len(地址_表)时停止

我已经编写了第一轮手动连接的代码,并且部分编写了我认为while循环的一般外观。我遇到的主要问题是,试图找出每次如何重命名右表中的列,然后使用最近附加的“上游设备id”作为下一次连接迭代的左键。ADD_DEV是从仅包含地址的设备筛选出的表。NO_ADD是从设备中筛选出的第二个表,它包含除地址之外的所有内容

 add_dev.merge(
     no_add[["id","device_type","upstream_device_id"]],
     how="left",
     left_on="upstream_id",
     right_on="id"
 )
 add_dev["left_join"] = add_dev["upstream_device_id"]
 count = len(add_dev.index)
 x=0
 while count > 0:
   x=x+1

   add_dev.merge(
       no_add[["id","device_type","upstream_device_id"]].rename(
           index=str, columns={
               "id":"id_[x]", 
               "device_type":"device_type_[x]",
               "upstream_device_id":"upstream_device_id_[x]"
           }), 
           how="left",
           left_on="left_join",
           right_on="id_[x]"
       )       

 add_dev["node_flag"]=np.where(add_dev["device_type_[x]"]=='node',1,0)
 add_dev["left_join"] = np.where(add_dev["node_flag"] == 1, 0, add_dev[upstream_device_id_[x]])

 count = len(add_dev.index)-add_dev["tap_flag"].sum()

因此,最终的add_dev数据帧将有“x”+1个id、device_type_id和upstream_device_id列。但是我知道我不能像上面那样使用[x]重命名列。有什么想法吗?我怎样才能让它发挥作用

找到了答案。希望这能帮助任何和我有类似问题的人

add_dev = device[device["device_type"]=="address"]

add_dev["join_left"]=add_dev["upstream_device_id"]

count = add_dev.shape[0]
x=0

while count>0:
  x+=1
  add_dev = add_dev.merge(
       no_add[["id","device_type","upstream_device_id"]].rename(
           index=str, columns={
               "id":"id_"+str(x), 
               "device_type":"device_type_"+str(x),
               "upstream_device_id":"upstream_device_id_"+str(x)
           }), 
     how="left",
     left_on="join_left",
     right_on="id_"+str(x)
  )

  add_dev["node_flag"]=np.where(add_dev["device_type_"+str(x)]=='node',1,0)
  add_dev["join_left"] = np.where(add_dev["node_flag"] == 1, -999, add_dev["upstream_device_id_"+str(x)])
  count = add_dev.shape[0]-add_dev["node_flag"].sum()