Python 在dataframe上迭代,从另一行中的数据更新值,然后删除另一行

Python 在dataframe上迭代,从另一行中的数据更新值,然后删除另一行,python,pandas,dataframe,loops,Python,Pandas,Dataframe,Loops,我有一个7000行的熊猫数据框,下面是一个示例 我需要填写缺少的分支类型列,缺少的信息在下面的行中可用。对于第一行,我在数据框['link\u name']中搜索B-A,并使用根类型作为分支名称 提取后,我想删除我从中提取的root\u type行,以获得如下输出: 我尝试了下面的代码,但无法正常工作 count = 0 missing = 0 errored_links=[] for i,j in bmx.iterrows(): try: spn = bmx[bmx

我有一个7000行的熊猫数据框,下面是一个示例

我需要填写缺少的分支类型列,缺少的信息在下面的行中可用。对于第一行,我在数据框
['link\u name']
中搜索B-A,并使用
根类型
作为分支名称

提取后,我想删除我从中提取的
root\u type
行,以获得如下输出:

我尝试了下面的代码,但无法正常工作

count = 0
missing = 0
errored_links=[]
for i,j in bmx.iterrows():
    try:
        spn = bmx[bmx.link_name ==j.link_reverse_name].root_type.values[0]
        index_t =  bmx[bmx.link_name ==j.link_reverse_name].root_type.index[0]
        bmx.drop(bmx.index[index_t],inplace=True)
        count+=1
        bmx.at[i,'branch_type']=spn
    except:
        bmx.at[i,'branch_type']='missing'
        missing+=1
        errored_links.append(j)

print('Iterations: ',count)
print('Missing: ', missing)

建立一个包含要删除的索引的列表,执行该操作,并在迭代所有行之后删除不需要的行。不要在循环中使用if/else,只需通过start将all设置为missing,然后将那些具有分支类型的设置为其值

bmx=pd.DataFrame({'link_name':[“A-B”,“C-D”,“B-A”,“D-C”],
“根类型”:[“类型1”、“类型2”、“类型6”、“类型1”],
“分支类型”:[“”、“”、“”、“”、“”],
‘link_reverse_name’:[“B-A”、“D-C”、“A-B”、“C-D”],
列=['link\u name'、'root\u type'、'branch\u type'、'link\u reverse\u name'])
bmx[“branch_type”]=“missing”#在开始时将所有设置为missing,去掉ifs:)
删除=[]
对于bmx.iterrows()中的i,j:
如果(我要删除):
继续#如果我们已将该行标记为要删除,请跳过
link=bmx[bmx.link\u name==j.link\u reverse\u name]。根目录类型。值[0]
idx=bmx[bmx.link\u name==j.link\u reverse\u name]。索引
如果链接:
j、 分支类型=链路
要_remove.append(idx[0])#将索引附加到列表中
bmx.drop(要移除,原地=真)
打印(bmx)
我们得到了期望的输出:

  link_name root_type branch_type link_reverse_name
0       A-B     type1       type6               B-A
1       C-D     type2       type1               D-C

当然,我希望所有条目都是唯一的,否则会产生一些重复项。为了简单起见,我没有使用与问题无关的COL。

只需提及,屏幕中有“root\u产品”,在代码中称为“root\u类型”。是的,是一个拼写错误,感谢您指出:)谢谢,效果很好。只是有一些错误,因为link_名称有时会丢失,但我想我会把它放在try语句中