首页 > 解决方案 > 熊猫 df 循环 + 合并

问题描述

大家好,我需要你的智慧,

我对 python 和 pandas 还是新手,我希望实现以下目标。

df = pd.DataFrame({'code': [125, 265, 128,368,4682,12,26,12,36,46,1,2,1,3,6], 'parent': [12,26,12,36,46,1,2,1,3,6,'a','b','a','c','f'], 'name':['unknow','unknow','unknow','unknow','unknow','unknow','unknow','unknow','unknow','unknow','g1','g2','g1','g3','g6']})

ds = pd.DataFrame({'code': [125, 265, 128,368,4682], 'name': ['Eagle','Cat','Koala','Panther','Dophin']})

我想在数据框中添加一个ds具有最高父级名称的新列。

作为第一行的示例:

code | name | category
125 | Eagle | a

“a”是df.code和之间循环的结果df.parent 125 > 12 > 1 > a

由于最后一个父母不是数字而是字母,我认为我必须使用正则表达式而不是 pandas 的 .merge 来填充ds['category']列。也可能使用应用功能,但它似乎有点超出我目前的知识。

谁能帮我解决这个问题?

问候,

标签: pythonpandas

解决方案


以下当然不是最快的解决方案,但如果您的数据框不太大,它就可以工作。首先从父代码创建一个字典,df然后递归地应用这个字典,直到你结束。

p = df[['code','parent']].set_index('code').to_dict()['parent']

def get_parent(code):
    while par := p.get(code):
        code = par
    return code

ds['category'] = ds.code.apply(get_parent)

结果:

   code     name category
0   125    Eagle        a
1   265      Cat        b
2   128    Koala        a
3   368  Panther        c
4  4682   Dophin        f

PS:get_parent使用赋值表达式(Python >= 3.8),对于旧版本的 Python,您可以使用:

def get_parent(code):
    while True:
        par = p.get(code)
        if par:
            code = par
        else:
            return code

推荐阅读