While循环加入熊猫数据框

Posted

技术标签:

【中文标题】While循环加入熊猫数据框【英文标题】:While loop to join panda dataframes 【发布时间】:2018-08-10 21:20:24 【问题描述】:

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

问题是节点和地址之间可以有多个安培。我正在尝试查找每个地址附加到哪个节点。每个设备(地址、放大器、节点)都有一个 ID、DEVICE_TYPE_DESC 和一个 UPSTREAM_DEVICE_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 循环,它将再次迭代地加入设备表,并创建一个会改变的标志当join引入节点时为1,当node_flag=len(address_table)之和时停止。

我已经编写了第一轮手动加入的代码,并部分编写了我认为 while 循环的一般外观可能的样子。我遇到的主要问题是试图弄清楚如何每次重命名右表中的列,然后使用最近附加的“upstream_device_id”作为下一次加入迭代的左键。 ADD_DEV 是来自 DEVICE 的过滤表,仅包含地址。 NO_ADD 是来自 DEVICE 的第二个过滤表,其中包含除地址之外的所有其他内容

 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] 重命名列。有什么想法以及如何让它发挥作用?

【问题讨论】:

【参考方案1】:

想通了。希望这会帮助任何与我有类似问题的人。

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()

【讨论】:

以上是关于While循环加入熊猫数据框的主要内容,如果未能解决你的问题,请参考以下文章

在熊猫数据框中组合字符串在while-if-elif循环中只工作一次[重复]

Pandas循环遍历数据帧并使用while循环列表

Ajax 仅适用于第一次从 php 中的 while 循环中获取数据

循环结构是什么? while与do while的区别

基本数据类型(While循环,For循环,列表以及相关用法)

MySQL 中的 While 循环使用连接和子查询选择数据