为了账号安全,请及时绑定邮箱和手机立即绑定

基于列值的高效逐行操作(聚合)

基于列值的高效逐行操作(聚合)

眼眸繁星 2022-05-24 12:57:05
我正在处理一个大型数据集,需要将某些列组合成一个列表。挑战在于,选择的列数取决于另一个键值,每行都不同。例子:原始数据集:Key Col1 Col2 Col3 Col4 Col5 NonrelatedCols1   a    b    c    d    e    ...3   r    b    x    d    c    ...2   k    d    q    l    w    ...0   w    a    c    s    w    ...预期结果:Key  List      NonrelatedCols1    [a]       ...3    [r,b,x]   ...2    [k,d]     ...0    []        ...主要挑战在于代码的性能。遍历行,不是最佳方法,我正在寻找一种更有效的方法。我试图只选择目标列,然后使用该agg(list,axis=1)功能。问题是,没有办法根据键值聚合列。看来,我仍然必须对所有行进行迭代,然后在组合列中删除过多的值Cols = ['Col1', 'Col2', 'Col3','Col4','Col5']CombinedList = rawData[Cols].agg(list,axis=1)for i in range(rawData.shape[0]):    CombinedList[i]=CombinedList[i][:rawData['Key'][i]]总结一下,有没有办法简化代码,所以我不需要遍历所有行?
查看完整描述

2 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

只考虑重要的列:


    Key Col1 Col2 Col3 Col4 Col5

0    1    a    b    c    d    e

1    3    r    b    x    d    c

2    2    k    d    q    l    w

3    0    w    a    c    s    w

假设Key总是在第一列,apply该list函数Col对除第一列以外的所有感兴趣的列 ( Key),然后根据 中的值对列表进行索引Key:


df.apply(lambda x : list(x[1:])[:x[0]], axis=1)

这需要Key是一个int

如果Key不是int,则使用df = df.astype({'Key': 'int32'})

输出:


0          [a]

1    [r, b, x]

2       [k, d]

3           []


查看完整回答
反对 回复 2022-05-24
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

尝试:


df.apply(lambda x: x[1:x.Key+1].tolist(), axis=1)

输出:


0          [a]

1    [r, b, x]

2       [k, d]

3           []

dtype: object


查看完整回答
反对 回复 2022-05-24
  • 2 回答
  • 0 关注
  • 120 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号