找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 131|回复: 12

[求助] pandas递归

3

主题

19

帖子

19

积分

贫民

积分
19
wxl3322335 发表于 2018-1-9 01:15:08 | 显示全部楼层 |阅读模式
本帖最后由 wxl3322335 于 2018-1-9 09:55 编辑

大神们
请看图片,请问如何用pandas 递归实现,谢谢!
a = pd.DataFrame({'father': ['A', 'A', 'B', 'B', 'a1', 'a1'],
                'child': ['a1', 'a2', 'a1', 'a2', 'a11', 'a12'],
                'qty': ['2', '2', '3', '3', '2', '3']})
b = pd.DataFrame({'father': ['A']})
pandas.png
回复

使用道具 举报

2

主题

213

帖子

213

积分

版主

Rank: 7Rank: 7Rank: 7

积分
213

热心会员默默耕耘优秀版主

剑心无痕 发表于 2018-1-9 08:54:00 | 显示全部楼层
本帖最后由 剑心无痕 于 2018-1-9 09:04 编辑
  1. import pandas as pd
  2. a = pd.DataFrame({'father': ['A', 'A', 'B', 'B', 'a1', 'a1'],
  3.                 'child': ['a1', 'a2', 'a1', 'a2', 'a11', 'a12'],
  4.                 'qty': ['2', '2', '3', '3', '2', '3']})
  5. b = pd.DataFrame({'father': ['A']})
  6. c = pd.concat([a[a['father'] == i] for i in set(b['father'])])
  7. final = pd.concat([a[a['father'] == i] for i in set(c['child'])] + [c])
复制代码

回复 支持 1 反对 0

使用道具 举报

3

主题

19

帖子

19

积分

贫民

积分
19
wxl3322335  楼主| 发表于 2018-1-9 09:53:55 | 显示全部楼层

哇 谢谢大神,早上一开电脑就看到您的回复,太感谢了,小弟我研究了还就,谢谢您!
太感谢了!
回复 支持 反对

使用道具 举报

3

主题

19

帖子

19

积分

贫民

积分
19
wxl3322335  楼主| 发表于 2018-1-9 09:58:08 | 显示全部楼层

不过大神, a11,a12 有计算的呦,要乘以 father 的数量的,请大神再帮看看吧,谢谢!
回复 支持 反对

使用道具 举报

2

主题

213

帖子

213

积分

版主

Rank: 7Rank: 7Rank: 7

积分
213

热心会员默默耕耘优秀版主

剑心无痕 发表于 2018-1-9 10:37:02 | 显示全部楼层
wxl3322335 发表于 2018-1-9 09:58
不过大神, a11,a12 有计算的呦,要乘以 father 的数量的,请大神再帮看看吧,谢谢! ...

A a1 1为什么是1? 而A a2 是2,没看懂
回复 支持 反对

使用道具 举报

3

主题

19

帖子

19

积分

贫民

积分
19
wxl3322335  楼主| 发表于 2018-1-9 10:41:04 | 显示全部楼层
剑心无痕 发表于 2018-1-9 10:37
A a1 1为什么是1? 而A a2 是2,没看懂

大神,一个a1  由2 个 a11组成,  一个A 由2个a1组成 ,所以 一个A 里面有 4个 a11
一层一层展开的,谢谢大神!
回复 支持 反对

使用道具 举报

2

主题

213

帖子

213

积分

版主

Rank: 7Rank: 7Rank: 7

积分
213

热心会员默默耕耘优秀版主

剑心无痕 发表于 2018-1-9 10:42:32 | 显示全部楼层
wxl3322335 发表于 2018-1-9 09:58
不过大神, a11,a12 有计算的呦,要乘以 father 的数量的,请大神再帮看看吧,谢谢! ...
  1. import pandas as pd
  2. a = pd.DataFrame({'father': ['A', 'A', 'B', 'B', 'a1', 'a1'],
  3.                 'child': ['a1', 'a2', 'a1', 'a2', 'a11', 'a12'],
  4.                 'qty': [2, 2, 3, 3, 2, 3]})
  5. b = pd.DataFrame({'father': ['A']})
  6. c = pd.concat([a[a['father'] == i] for i in set(b['father'])])

  7. final = pd.concat([a[a['father'] == i].apply(lambda r: r * len(c) if r.name == 'qty' else r) for i in set(c['child'])] + [c])
复制代码


这个结果是2,2,4,6不是1,2,4,6

点评

谢谢老师!  发表于 2018-1-9 10:51
回复 支持 反对

使用道具 举报

3

主题

19

帖子

19

积分

贫民

积分
19
wxl3322335  楼主| 发表于 2018-1-9 10:51:17 | 显示全部楼层
剑心无痕 发表于 2018-1-9 10:42
这个结果是2,2,4,6不是1,2,4,6

哇 大神 太膜拜您了,谢谢老师,可以关注您微博吗? 谢谢您!
回复 支持 反对

使用道具 举报

3

主题

19

帖子

19

积分

贫民

积分
19
wxl3322335  楼主| 发表于 2018-1-9 12:31:44 | 显示全部楼层
本帖最后由 wxl3322335 于 2018-1-9 13:08 编辑
剑心无痕 发表于 2018-1-9 10:42
这个结果是2,2,4,6不是1,2,4,6

版主,您那个 乘以 len(c)  不对的,
其实意思就是   一辆汽车有  四个轮子      一个轮子有  一个轮胎 4根骡子          一根螺丝有1 块铁
意思就是一层层展开,要计算的,
下面是我写的sql:
请您根据这个sql 帮改改,谢谢您!
sql:
WITH RECURSIVE cte as
(select father,child,qty,1 level from bom where father in("PN001")
union all
select a.father,a.child,a.qty*b.qty,b.level+1 from bom a,cte b where a.father=b.child
) select * from cte;

版主请看详细描述:
我附件也上传了,谢谢版主!



物料计算(请版主大神帮忙).xlsm

29.46 KB, 下载次数: 0

回复 支持 反对

使用道具 举报

2

主题

213

帖子

213

积分

版主

Rank: 7Rank: 7Rank: 7

积分
213

热心会员默默耕耘优秀版主

剑心无痕 发表于 2018-1-9 13:07:14 | 显示全部楼层
wxl3322335 发表于 2018-1-9 12:31
版主,您那个 乘以 len(c)  不对的,
其实意思就是   一辆汽车有  四个轮子      一个轮子有  一个轮胎 4 ...

len(c)换成c[c['child'] == i]['qty'][0] ,这个意思?
  1. final = pd.concat([a[a['father'] == i].apply(lambda r: r * c[c['child'] == i]['qty'][0] if r.name == 'qty' else r) for i in set(c['child'])] + [c])
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表