Pandas 中的递归 SQL CTE 查询?

2023-11-24

如何优雅地将下面的递归 SQL 查询移植到 Pandas python 代码中? 不知何故,如果不编写自己的递归函数,我就看不到一种直接的方法?

Python 示例代码:

import datetime
import numpy as np
import pandas as pd
import pandas.io.data
from pandas import Series, DataFrame

data = {
        'ID': [1,2,3,4,5,6,7,8],
        'Name': ['Keith','Josh','Robin','Raja','Tridip','Arijit','Amit','Dev'],
        'MgrID': [0,1,1,2,0,5,5,6]
    }

df = pd.DataFrame.from_dict(data)
df.set_index('ID', inplace=True, drop=False, append=False)
df.ix[df.query('MgrID >0')['MgrID']]

试图得到这个:

nLevel      ID          Name
================================
1           6            Arijit
2           8               Dev
1           1            Keith
2           2               Josh
2           3               Robin
3           4                 Raja
1           5            Tridip
2           7               Amit

递归 SQL 查询:

;WITH Employee (ID, Name, MgrID) AS 
(
    SELECT 1,      'Keith',      NULL   UNION ALL
    SELECT 2,      'Josh',       1      UNION ALL
    SELECT 3,      'Robin',      1      UNION ALL
    SELECT 4,      'Raja',       2      UNION ALL
    SELECT 5,      'Tridip',     NULL   UNION ALL
    SELECT 6,      'Arijit',     NULL      UNION ALL
    SELECT 7,      'Amit',       5      UNION ALL
    SELECT 8,      'Dev',        6   
)
,Hierarchy AS
(
    --  Anchor
    SELECT   ID
            ,Name
            ,MgrID
            ,nLevel = 1
            ,Family = ROW_NUMBER() OVER (ORDER BY Name)
    FROM Employee
    WHERE MgrID IS NULL

    UNION ALL
    --  Recursive query
    SELECT   E.ID
            ,E.Name
            ,E.MgrID
            ,H.nLevel+1
            ,Family
    FROM Employee   E
    JOIN Hierarchy  H ON E.MgrID = H.ID
)
SELECT nLevel ,ID,space(nLevel+(CASE WHEN nLevel > 1 THEN nLevel ELSE 0 END))+Name Name FROM Hierarchy ORDER BY Family, nLevel

首先,你需要纠正Python代码中的拼写错误MgrID list: [0,1,1,2,0,0,5,6]

其次,如果这项工作是在 SQL 中递归完成的,为什么你期望 Python/Pandas 可以在不使用递归方法的情况下完成它?这并不难:

def nlevel(id, mgr_dict=df.MgrID, _cache={0:0}):
    if id in _cache:
        return _cache[id]

    return 1+nlevel(mgr_dict[id],mgr_dict)

df['nLevel'] = df.ID.map(nlevel)

print df[['nLevel','ID','Name']]

然后输出(nLevel) 是你所需要的(除了顺序,我从你的 SQL 中无法理解):

    nLevel  ID    Name
ID                    
1        1   1   Keith
2        2   2    Josh
3        2   3   Robin
4        3   4    Raja
5        1   5  Tridip
6        1   6  Arijit
7        2   7    Amit
8        2   8     Dev

[8 rows x 3 columns]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pandas 中的递归 SQL CTE 查询? 的相关文章

  • 学习Python中的解析器

    我记得我读过有关解析器的内容 您只需提供一些示例行 它就知道如何解析某些文本 它只是确定两条线之间的差异 以了解可变部分是什么 我以为它是用 python 写的 但我不确定 有谁知道那是什么图书馆吗 可能你的意思是模板制作器 http co
  • 使用ideone时如何传入命令行参数?

    我正在使用 ideone 在线解释器 http ideone com http ideone com 来测试一些 C 和 Python 程序 如何指定命令行参数而不是使用 STDIN 输入 看起来你不能 但是快速破解应该做的伎俩 stati
  • caffe安装:opencv libpng16.so.16链接问题

    我正在尝试在 Ubuntu 14 04 机器上使用 python 接口编译 caffe 我已经安装了 Anaconda 和 opencvconda install opencv 我还安装了咖啡中规定的所有要求 并更改了注释块makefile
  • 如何在Python + Selenium中获取元素的值

    我在我的 Python 3 6 3 代码中得到了这个 HTML 元素 作为 Selenium网页元素当然 span class ocenaCzastkowa masterTooltip style color 000000 alt 5 sp
  • 获取字符串模板中所有标识符列表的函数(Python)

    对于标准库string template在Python中 有没有一个函数可以获取所有标识符的列表 例如 使用以下 xml 文件
  • 无法使用Python请求会话模块登录网站

    我刚刚开始进行网络抓取 对于我的第一个项目 我尝试使用 requests Session 登录 artofproblemsolving com 并访问另一个用户的帐户 这是我的代码 import requests LOGIN URL htt
  • 右键单击 QPushButton 上的 contextMenu

    对于我的应用程序 我在 Qt Designer 中创建了一个 GUI 并将其转换为 python 2 6 代码 关于一些QPushButton 与设计器创建 我想添加右键单击上下文菜单 菜单选项取决于应用程序状态 如何实现这样的上下文菜单
  • 当元组列表中相同项目的值是字符串时,对它们的值求和

    如果我有这样的元组列表 my list books 5 books 10 ink 20 paper 15 paper 20 paper 15 我怎样才能把列表变成这样 books 15 ink 20 paper 50 即添加同一项目的费用
  • Pandas 中每列的曲线拟合 + 外推值

    我有一个包含大约 300 列的数据集 每一列都与深度相关 Pandas DataFrame 的简化版本看起来像这样 import matplotlib pyplot as plt import numpy as np import pand
  • Pygame:有人可以帮我实现双跳吗?

    我知道已经有其他关于此问题的帖子了 但我的运动系统与我发现的有点不同 所以随后我问这个问题 我的运动系统基于一个名为的命名元组Move up left right down 然后就是这个 def update self move block
  • Django 1.7:如何使用 html/css 文件作为模板发送电子邮件

    从 Django 1 7 开始 可以send email 使用新参数 html message 不幸的是 没有关于如何使用它的全面指南 新手友好 或者至少我找不到它 我需要使发送的电子邮件变得漂亮 因此 我试图弄清楚如何将我的消息包含到 h
  • 如何将 pandas DataFrame 转换为 TimeSeries?

    我正在寻找一种将 DataFrame 转换为 TimeSeries 而不拆分索引和值列的方法 有任何想法吗 谢谢 In 20 import pandas as pd In 21 import numpy as np In 22 dates
  • 在字符串内打印单引号

    我想输出 XYZ s ABC 我在Python IDLE中尝试了以下3条语句 第一条和第二条语句输出 a before 带打印功能的第三条语句不输出 before 作为 Python 新手 我想了解为什么 之前输出 在第 1 条和第 2 条
  • 在Python中随机交错2个数组

    假设我有两个数组 a 1 2 3 4 b 5 6 7 8 9 我想将这两个数组交错为变量 c 注意 a 和 b 不一定具有相同的长度 但我不希望它们以确定性的方式交错 简而言之 仅仅压缩这两个数组是不够的 我不想要 c 1 5 2 6 3
  • python 中的 F 字符串前缀给出语法错误[重复]

    这个问题在这里已经有答案了 我有一个名为 method 的变量 它的值是 POST 但是当我尝试运行时print f method method is used 它不断在最后一个双引号处给出语法错误 我找不到它这样做的原因 我正在使用 py
  • 本地主机上的 Google App Engine GQL 查询

    我正在 Google App Engine Windows 上的 SDK 版本 1 7 0 上开发一个应用程序 我需要经常测试该应用程序 并且此测试涉及数据存储上的大量 GQL 查询 您可以在 App Engine 管理界面的浏览器中在线运
  • 如何将Python包从旧版本安装到新版本?

    我正在使用 python 3 7 最近在 Linux 中安装了 python 3 8 是否有任何 bash 命令或脚本可以获取 3 7 的所有软件包列表并在 3 8 版本中一一安装 我想避免每个包裹都手工完成 注意 我将它们安装在我的系统中
  • Django 中使用外键的抽象基类继承

    我正在尝试在 Django 支持的网站上进行模型继承 以遵守 DRY 我的目标是使用一个名为 BasicCompany 的抽象基类来为三个子类提供通用信息 Butcher Baker CandlestickMaker 它们位于各自的应用程序
  • 将函数按元素应用于两个 DataFrame

    如何应用函数z ij f x ij y ij 来自数据框X and Y相同大小并将结果保存到 DataFrameZ 这取决于你有什么样的功能 很多功能已经被矢量化为数据框 例如 等等 所以对于这些功能 你可以简单地做Z X Y or Z X
  • 如何使用 keras.backend.gradients() 获取梯度值

    我试图获得 Keras 模型的输出相对于模型输入 x 而不是权重 的导数 似乎最简单的方法是使用 keras backend 中的 梯度 它返回梯度张量 https keras io backend https keras io backe

随机推荐

  • PHP mkdir() 权限

    我有一个 Linux 服务器 使用 apache 作为 Web 服务器 在我的 PHP 脚本中 我正在创建目录0777模式 代码非常简单 如下所示 mkdir path 0777 当我运行此脚本并转到我的服务器文件管理器时 该文件夹就在那里
  • PHP 简单 HTML DOM 解析器在有效 url 上返回 false

    我正在尝试以下操作 url https www tripadvisor es Hotels g187514 Madrid Hotels html ta html file get html url var dump ta html 它返回
  • Dialog 或 DialogFragment 中的 Activity 是否有等效的dispatchTouchEvent()

    我需要拦截应用程序中的所有触摸事件以监视自定义活动超时 目前我使用dispatchTouchEvent 在我的活动中 但如果屏幕上有对话框 则不会调用此函数 有谁知道是否有任何方法可以在存在对话框的情况下拥有相同的功能 Thanks For
  • Javascript - 在新选项卡中打开链接(同一窗口)

    我意识到这个主题已经有几个问题了 但它们似乎都很老了 只是想为此获得最新的答案 打开新选项卡 在同一浏览器窗口内 的标准方式仍然是 window open url blank window focus 另外 我读到它取决于浏览器的用户配置
  • 将 2 个元素数组的 JavaScript 数组转换为对象键值对

    从这样的事情中获得最快的算法是什么 var array 1 a 2 b 3 c 像这样的事情 Object 1 a 2 b 3 c 到目前为止 这就是我想出的 function objectify array var object arra
  • 计算元音

    谁能告诉我这个脚本有什么问题吗 我是一个 python 新手 但我似乎无法弄清楚是什么导致它无法运行 def find vowels sentence gt gt gt find vowels test 1 count 0 vowels a
  • Matlab中有高斯差分函数吗?

    我是图像处理新手 在我的实验中 我在高斯差分方面遇到困难 给了我各种实现 但我不理解它们及其参数 这是我的公式 我应该自己实现这个过滤 还是有为此定义的现有函数 当然 所有参数都类似于链接中的参数 我需要调整参数并生成不同的图像 您可以使用
  • 如何访问 Angular2 中的 HTML 视频元素

    我有一个 HTML5
  • 使用 char 作为主键/外键是否不行?

    考虑有一堆链接到 国家 或 货币 表的表 为了使数据更易于阅读 我想在这两个表中的每个表中使用国家代码 例如美国 GB AU 和货币代码 美元 澳元 创建 CHAR 字段作为主键 并且所有其他表将使用此 CHAR 作为外键 数据库是带有in
  • iPhone - 将 NSString 编码从 WindowsCP1251 转换为 UTF8

    我怎样才能得到这个转换NSWindowsCP1251StringEncoding to UTF 8 我进行了多次尝试 但没有人能达到应有的效果 我最后的尝试是 NSData dt mystr dataUsingEncoding NSUTF8
  • 如何在使用 ParcelJS 构建的 Cypress 测试中使用绝对路径导入?

    我在 Parcel 项目中使用带有绝对路径的导入 但 Cypress 测试并不能同样解析这些绝对路径 模块分辨率差异 Parcel import foo from foo js 相对于项目根目录 Cypress import foo fro
  • Jquery 中的 Ajax.updater 相当于什么?

    请让我知道 Jquery 中以下原型代码的等效内容 var myAjax new Ajax Updater abc billing add bill detail method get parameters pars insertion I
  • tkinter 窗口获取 x、y、几何/坐标,无需窗口顶部

    我在 python 3 中使用 tk 尽管我假设这适用于任何语言 我正在寻找标题栏之外的 tk 窗口的当前 x y 坐标 import tkinter root tkinter Tk 然而 使用root winfo y 给我坐标 包括标题栏
  • 无法使用 jquery/javascript 在 html5 视频中设置 video.currentTime

    无论是从控制台还是从我的标签中 我都无法使用 JavaScript 设置 html5 视频元素的当前时间 我也在使用 jQuery 但我不知道这是否与该问题相关 我在 Ubuntu 上使用 Google Chrome 24 0 1312 5
  • 创建脚本语言

    有人可以指导我创建针对 WSH Windows 脚本主机 的脚本语言的正确方向吗 我用谷歌搜索过它 但与我几个月前最初搜索它时相比 与此相关的链接似乎要少得多 谢谢 该产品现在称为 Windows Script Host MSDN 文档表明
  • 在 (x) 个字符后剪切文本

    这是在 WordPress 中 不确定这有什么区别 这段 php 输出帖子标题 它是简单文本 长度最多可达 100 个字符 我想要的是如果输出的字符超过 20 长以显示 或根本不显示任何内容 Thanks 检查字符串长度后strlen us
  • delete[] 提供了一个修改后的新指针。未定义的行为?

    我在同行代码评审会议期间看到了如下一些代码 char s new char 3 s a s b s 0 delete s this may or may not crash on some or any day 首先 我知道在标准 C 中
  • 使用 Emacs 在尚未打开的文本文件中递归查找和替换

    作为后续这个问题 它试图找出如何做这样的事情 这应该很容易 这尤其阻止我更习惯使用 Emacs 而是启动我已经熟悉的编辑器 我在编辑多个文件时经常使用这里的示例 在 Ultraedit 中 我会先按 Alt s 然后按 p 显示一个对话框
  • 构建状态管理存储(ngrx/redux)。扁平代表数据,还是嵌套代表视图?

    我正在使用 ngrx 存储来维护应用程序状态 使用 normalizr 来展平来自 API 调用和 Immutable 的数据 到目前为止 它运行得非常好 但我正在处理一些更复杂的数据关系 我想知道如何继续构建商店 为了简化事情 我有两组对
  • Pandas 中的递归 SQL CTE 查询?

    如何优雅地将下面的递归 SQL 查询移植到 Pandas python 代码中 不知何故 如果不编写自己的递归函数 我就看不到一种直接的方法 Python 示例代码 import datetime import numpy as np im