【问题标题】:Pandas: Aggregating lists in dataframePandas:在数据框中聚合列表
【发布时间】:2017-06-23 02:54:07
【问题描述】:

假设我有以下数据框:

   VehID   Material  JobNo
0  10000      5005  [1, 2]
1  10000      5100  [1, 2, 4, 5, 6]
2  10001      5222  [2, 3, 4]
3  10001      5888  [1, 3]

我想提取“JobNo”中的列表元素以连续方式出现的实例。例如:

   VehID  Material   JobNo     Len
0  10000      5005  [1, 2]      2
1  10000      5100  [1, 2]      2
2  10000      5100  [5, 6]      2
3  10001      5222  [2, 3, 4]   3

有人对此有一个巧妙的解决方案吗?任何帮助将非常感激。提前致谢!

【问题讨论】:

    标签: python python-2.7 pandas


    【解决方案1】:

    使用numpy.diffnumpy.split 分解不连续的列表

    def split_jobs(x):
        return np.split(x, np.where(np.append(False, np.diff(x) != 1))[0])
    
    j = df.JobNo.apply(split_jobs)
    l1 = j.str.len()
    
    slc = np.arange(len(df)).repeat(l1)
    d1 = pd.DataFrame(dict(
            VehID=df.VehID.values[slc],
            Material=df.Material.values[slc],
            JobNo=list(chain(*j.tolist()))
        ))[df.columns.tolist()]
    
    d1[d1.JobNo.str.len() > 1]
    
       VehID  Material      JobNo
    0  10000      5005     [1, 2]
    1  10000      5100     [1, 2]
    2  10000      5100  [4, 5, 6]
    3  10001      5222  [2, 3, 4]
    

    【讨论】:

    • 感谢您的快速回复!您的答案效果很好,对“np.arange(len(df)).repeat(l1)”稍作修改。否则程序会抛出以下错误:Cannot cast array data from dtype('int64') to dtype('int32') based on the rule 'safe'
    猜你喜欢
    • 1970-01-01
    • 2018-01-25
    • 2021-11-04
    • 1970-01-01
    • 2017-06-20
    • 2017-02-05
    • 2023-03-07
    • 2012-08-26
    • 1970-01-01
    相关资源
    最近更新 更多