Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫df回路+;合并_Python_Pandas - Fatal编程技术网

Python 熊猫df回路+;合并

Python 熊猫df回路+;合并,python,pandas,Python,Pandas,大家好我需要你们的智慧 我还不熟悉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','u

大家好我需要你们的智慧

我还不熟悉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
dataframe中添加一个新列,其中包含最高父级的名称

作为第一行的示例:

code | name | category
125 | Eagle | a
“a”是
df.code
df.parent
125>12>1>a

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

有人能帮我吗


在这方面,

以下肯定不是最快的解决方案,但如果您的数据帧不太大,它就可以工作。首先从
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\u parent
使用赋值表达式(Python>=3.8),对于较旧版本的Python,您可以使用:

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

您的
df
定义不正确(ValueError:array必须都是相同的长度)确实很抱歉我编辑了这篇文章。非常感谢您,它工作得非常完美。我不太理解while循环,所以我必须研究它。即使第二个版本看起来更容易阅读;)