您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python – Pandas:在列中聚合列表值

5b51 2022/1/14 8:21:49 python 字数 2327 阅读 542 来源 www.jb51.cc/python

我有以下数据帧:data = {'VehID' : pd.Series([10000,10000,10000,10001,10001,10001,10001]), 'JobNo' : pd.Series([1,2,2,1,2,3,3]), 'Material' : pd.Series([5005,5100,5005,5888,

概述

我有以下数据帧:

data = {'VehID' : pd.Series([10000,10000,10001,10001]),'JobNo' : pd.Series([1,2,1,3,3]),'Material' : pd.Series([5005,5100,5005,5888,5222,5222])}
df   = pd.DataFrame(data,columns=['VehID','JobNo','Material'])
@H_502_7@

它看起来像这样:

   VehID    JobNo  Material
0  10000      1      5005
1  10000      2      5100
2  10000      2      5005
3  10001      1      5888
4  10001      2      5222
5  10001      3      5888
6  10001      3      5222
@H_502_7@

我想确定每辆车连续工作中出现的材料.例如,

VehID  Material  Jobs
10000    5005    [1,2]
10001    5222    [2,3]
@H_502_7@

我想避免使用for循环.有没有人对这个解决方案有什么建议?提前致谢..

>>> res = df.groupby(['VehID','Material'])['JobNo'].apply(list).reset_index()
>>> res
   VehID  Material   JobNo
0  10000      5005  [1,2]
1  10000      5100     [2]
2  10001      5222  [2,3]
3  10001      5888  [1,3]
@H_502_7@

现在您可以过滤掉所有非连续列表:

>>> f = res.JobNo.apply(lambda x: len(x) > 1 and sorted(x) == range(min(x),max(x)+1))
>>> res[f]
   VehID  Material   JobNo
0  10000      5005  [1,2]
2  10001      5222  [2,3]
@H_502_7@

您可以通过更智能的功能加速它 – 首先在res中存储alreadt排序列表,然后检查min,max和len与相同长度的范围

总结

以上是编程之家为你收集整理的python – Pandas:在列中聚合列表值全部内容,希望文章能够帮你解决python – Pandas:在列中聚合列表值所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶