再次感谢您能给我的任何帮助。我有一个数据集,其中包含光纤网络上设备的所有值,从中心节点向下滚动到节点的多个放大器,最后滚动到连接到该节点的所有地址。
问题是在节点和地址之间可能有多个放大器。我正在尝试找出每个地址连接到哪个节点。每个设备(地址、放大器、节点)都有一个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循环,它将再次迭代地连接到设备表,并创建一个标志,当连接引入节点时,该标志将更改为1,并在node_flag=len(address_table)之和时停止。
我已经编写了手动加入第一轮的代码,并部分编写了我认为while循环的一般外观。我遇到的主要问题是试图弄清楚如何每次重命名右表中的列,然后使用最近附加的'upstream_device_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来重命名列。你有什么想法,我怎么才能让它工作?
发布于 2018-03-03 02:10:57
我想通了。希望这能帮助那些和我有类似问题的人。
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()https://stackoverflow.com/questions/49072866
复制相似问题