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

前端之家收集整理的这篇文章主要介绍了python – Pandas:在列中聚合列表值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我有以下数据帧:

  1. 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])}
  2. df = pd.DataFrame(data,columns=['VehID','JobNo','Material'])

它看起来像这样:

  1. VehID JobNo Material
  2. 0 10000 1 5005
  3. 1 10000 2 5100
  4. 2 10000 2 5005
  5. 3 10001 1 5888
  6. 4 10001 2 5222
  7. 5 10001 3 5888
  8. 6 10001 3 5222

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

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

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

最佳答案
您可以先将数据收集到列表中,使用pandas.DataFrame.groupby,然后将pandas.DataFrame.applylist构造函数作为函数收集:

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

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

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

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

猜你在找的Python相关文章