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

时间:2019-09-09 01:48:16

标签: python pandas performance numpy dataframe

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

示例:

原始数据集:

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

总而言之,有没有一种方法可以简化代码,所以我不需要遍历所有行?

2 个答案:

答案 0 :(得分:2)

仅考虑重要的列:

    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的{​​{1}}函数将对除第一列(list)之外的所有Col感兴趣的列起作用,然后根据{{​​1}}中的值为列表编制索引:

Key
  • 这要求Keydf.apply(lambda x : list(x[1:])[:x[0]], axis=1)
    • 如果Key不是int,请使用Key

输出:

int

答案 1 :(得分:1)

尝试:

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

输出:

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