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

熊猫:加速Groupby

  •  1
  • stavrop  · 技术社区  · 6 年前

    假设数据帧:

    df=
    col_1 col_2 col3 
    id1   val1  1    
    id2   val1  4    
    id3   val1  5    
    id4   val1  7    
    id1   val2  3    
    id2   val2  2    
    id3   val2  8    
    id4   val2  4    
    

    对于每一行,我需要添加一列 col3 从所有其他行

    col2 == row[col2] AND col1 != row[col1]

    所以我应该得到:

    df=
    col_1 col_2 col3 col4
    id1   val1  1    16
    id2   val1  4    13
    id3   val1  5    12
    id4   val1  7    10
    id1   val2  3    14
    id2   val2  2    15
    id3   val2  8    9
    id4   val2  4    13
    

    我用apply之类的

    def getVal(row, df):
        return df[(df[col1] != row[col1]) & (df[col2] == row[col2])][col3].sum()
    
    df[col4] = df.apply(lambda x: getVal(x, df), axis = 1)
    

    但自从我 df >1000000 划船,需要永远!!!!
    有更好/更快的方法吗?

    提前谢谢你

    2 回复  |  直到 6 年前
        1
  •  2
  •   Scott Boston    6 年前

    使用 groupby 具有 transform 对于这一行,不合并:

    df['col4'] = df.groupby('col_2')['col3'].transform('sum') - df['col3']
    

    输出:

      col_1 col_2  col3  col4
    0   id1  val1     1    16
    1   id2  val1     4    13
    2   id3  val1     5    12
    3   id4  val1     7    10
    4   id1  val2     3    14
    5   id2  val2     2    15
    6   id3  val2     8     9
    7   id4  val2     4    13
    
        2
  •  0
  •   stavrop    6 年前

    @Roberto 把我指向正确的方向:

    df2 = df.groupby([col2])[col3].sum().reset_index().rename(columns = {col3:'extra_col'})
    df = pd.merge(df, df2, on = [col2], how = 'left')
    df[col4] = df[extra_col] - df[col3]