【问题标题】:Pandas df loop + merge熊猫 df 循环 + 合并
【发布时间】:2020-12-18 11:24:37
【问题描述】:

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

我还是 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.codedf.parent125 > 12 > 1 > a之间循环的结果

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

谁能帮我解决这个问题?

问候,

【问题讨论】:

  • 您的df 定义不正确(ValueError: 数组的长度必须相同)
  • 真的很抱歉我编辑了帖子。

标签: python pandas


【解决方案1】:

以下当然不是最快的解决方案,但如果您的数据框不太大,它就可以工作。首先从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

【讨论】:

  • 非常感谢它完美运行。我不太了解while循环,所以我必须研究一下。即使第二个版本看起来更容易阅读;)
猜你喜欢
  • 2018-02-11
  • 1970-01-01
  • 2020-08-29
  • 1970-01-01
  • 2021-05-20
  • 2019-02-12
  • 2019-03-07
  • 2018-02-11
  • 1970-01-01
相关资源
最近更新 更多