Pandas:在列中聚合列表值

时间:2017-02-03 11:24:16

标签: python list pandas

我有以下数据框:

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

看起来像这样:

   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

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

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

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

1 个答案:

答案 0 :(得分:3)

您可以先将数据收集到包含pandas.DataFrame.groupby的列表,然后将pandas.DataFrame.applylist构造函数作为函数收集:

>>> 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]

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

>>> 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]

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