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

我正在处理一个大型数据集,需要将某些列组合成一个列表。挑战在于,选择的列数取决于另一个键值,每行都不同。


例子:

原始数据集:

Key Col1 Col2 Col3 Col4 Col5 NonrelatedCols

1   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      NonrelatedCols

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

总结一下,有没有办法简化代码,所以我不需要遍历所有行?


眼眸繁星
浏览 121回答 2
2回答

尚方宝剑之说

只考虑重要的列:    Key Col1 Col2 Col3 Col4 Col50    1    a    b    c    d    e1    3    r    b    x    d    c2    2    k    d    q    l    w3    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           []

哆啦的时光机

尝试:df.apply(lambda x: x[1:x.Key+1].tolist(), axis=1)输出:0          [a]1    [r, b, x]2       [k, d]3           []dtype: object
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python