【问题标题】:Efficient row-wise operation (aggregation) based on column values基于列值的高效逐行操作(聚合)
【发布时间】:2019-09-09 01:48:16
【问题描述】:

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

示例:

原始数据集:

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

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

【问题讨论】:

    标签: python pandas performance numpy dataframe


    【解决方案1】:

    只考虑重要的列:

        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总是在第一列,applylist函数对除第一列(Key)之外的所有Col感兴趣的列,然后根据@987654327中的值索引列表@:

    df.apply(lambda x : list(x[1:])[:x[0]], axis=1)
    
    • 这要求Keyint
      • 如果Key 不是int,则使用df = df.astype({'Key': 'int32'})

    输出:

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

    【讨论】:

      【解决方案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
      

      【讨论】:

      • df.apply 是否比更显式的行迭代更快,或者只是更方便。我知道一些numpy 'apply' 功能只是方便的工具。
      • @hpaulj 我不认为带有axis=1的df.apply更快更方便。
      猜你喜欢
      • 2011-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多