【问题标题】:Pandas: Aggregating List Values in ColumnsPandas:在列中聚合列表值
【发布时间】:2017-06-20 18:13:27
【问题描述】:

我有以下数据框:

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 循环。有没有人对此有任何建议?提前谢谢..

【问题讨论】:

    标签: python list pandas


    【解决方案1】:

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

    >>> 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 中,然后检查具有相同长度范围的 min、max 和 len

    【讨论】:

    • 酷。我也在学习 Pandas,我正在研究大约有 50K 到 80K 条目的 Dataframe。以上对我有帮助。欣赏sorted(x) == range(min(x), max(x)+1) 逻辑检查连续作业
    猜你喜欢
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 2021-04-17
    • 2018-03-01
    • 2017-12-25
    相关资源
    最近更新 更多