python - 熊猫 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']
列。也可能使用应用功能,但它似乎有点超出我目前的知识。
谁能帮我解决这个问题?
问候,
解决方案
以下当然不是最快的解决方案,但如果您的数据框不太大,它就可以工作。首先从父代码创建一个字典,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
推荐阅读
- sockets - Microsoft Access VBA 代码无法从 TCP/IP 端口接收数据
- reactjs - How do I prevent component rerendering on browser resize?
- c++ - C++ 中的库需要什么?
- swift - 如何使用 URLSession 以 Multipart 表单数据发送音频文件?迅速
- git - 使用 git 将文件推送到 github 文件夹
- google-visualization - 如何解决“TypeError: dataView.setRowProperties is not a function at drawChart”错误
- python - Double and Float RuntimeError while training fasterrcnn_mobilenet
- c# - C# 8:通过属性为空状态静态分析指定属性值的可空性
- reactjs - React 查询失效在 React Native 中不起作用
- highcharts - Highcharts 股票如何设置默认或最大 xaxis 刻度量?