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

2024-10-01 09:34:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理一个大型数据集,需要将某些列合并到一个列表中。问题是,所选列的数量取决于另一个键值,每个行的键值都不同

示例:

原始数据集:

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

总而言之,有没有简化代码的方法,这样我就不需要遍历所有的行了


Tags: 方法key代码agglistcol2col3col1
2条回答

尝试:

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

输出:

0          [a]
1    [r, b, x]
2       [k, d]
3           []
dtype: object

只考虑重要列:

    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函数用于除第一列(Key)以外的所有感兴趣的Col列,然后根据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           []

相关问题 更多 >