代码之家  ›  专栏  ›  技术社区  ›  Ilya

使用排序列从数据帧中高效地选择行

  •  2
  • Ilya  · 技术社区  · 7 年前

    我有一个包含多列(c1…c8)和大约3200万行的大数据帧。数据帧已经按c1排序。我想从共享c1特定值的行中获取其他列值。

    类似于

    keys = big_df['c1'].unique()
    red = np.zeros(len(keys))
    for i, key in enumerate(keys):
        inds = (big_df['c1'] == key)
        v1 = np.array(big_df.loc[inds]['c2'])
        v2 = np.array(big_df.loc[inds]['c6'])
        red[i] = reduce_fun(v1,v2)
    

    然而,我认为这是非常慢的,因为它检查整个列的匹配标准(即使在32mil中可能只有10行是相关的)。由于big_df是按c1排序的,键只是所有唯一c1的列表,有没有快速的方法来获取红色[]数组(即我知道具有下一个键的第一行是前一个键的最后一行之后的行,我知道键的最后一行是与键匹配的最后一行,因为所有后续行都保证不匹配)。

    伊利亚

    编辑:我不确定unique()方法生成的顺序是什么,但我基本上希望键中的每个键都有一个reduce\u fun()的值,我并不特别关心它们的顺序(大概最简单的顺序是c1已经排序的顺序)。

    2 回复  |  直到 7 年前
        1
  •  6
  •   Alexander    7 年前

    我选择了一个字典而不是一个列表来保存输入到每个项目上的缩减值 c1 .

    red = {key: reduce_func(frame['c2'].values, frame['c7'].values) 
           for key, frame in df.groupby('c1')}
    
        2
  •  2
  •   PaSTE Zac Gochenour    7 年前

    a怎么样 groupby 列表中的语句理解?考虑到 DataFrame 已按排序 c1 :

    编辑 :忘记了 返回元组。哎呀!

    red = [reduce_fun(g['c2'].values, g['c6'].values) for i, g in big_df.groupby('c1', sort=False)]
    

    对我来说似乎很快就完成了(对于3000万个随机行,大约2秒,还有一个小小的reduce\u乐趣)。