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

Pandas group by返回应用vs变换函数的NAN

  •  1
  • mmrs151  · 技术社区  · 7 年前

    我陷入了两种无法解释自己的情况。第一件事是关于应用vs变换函数。据我所知,apply在整个数据帧上工作,而transform在每一行上工作,因此比apply慢。这是我的数据框,

    size    id
    40/6    2479
    41/7    2479
    42/8    2479
    43/9    2479
    44/10   2479
    45/11   2479
    46/12   2479
    

    现在,当我申请时 df.groupby('id')['size'].apply(lambda col: ', '.join(col)) 它返回

    0    NaN
    1    NaN
    2    NaN
    3    NaN
    4    NaN
    5    NaN
    6    NaN
    

    但如果我改变, df.groupby('id')['size'].transform(lambda col: ', '.join(col)) ,我明白了

    0    40/6, 41/7, 42/8, 43/9, 44/10, 45/11, 46/12
    1    40/6, 41/7, 42/8, 43/9, 44/10, 45/11, 46/12
    2    40/6, 41/7, 42/8, 43/9, 44/10, 45/11, 46/12
    3    40/6, 41/7, 42/8, 43/9, 44/10, 45/11, 46/12
    4    40/6, 41/7, 42/8, 43/9, 44/10, 45/11, 46/12
    5    40/6, 41/7, 42/8, 43/9, 44/10, 45/11, 46/12
    6    40/6, 41/7, 42/8, 43/9, 44/10, 45/11, 46/12
    

    我想让它与应用程序一起工作,因为我有300万行,速度是重要因素。

    第二期

    当我的尺寸数据有空单元格时,即

    size    id
            2479
    41/7    2479
            2479
    43/9    2479
    44/10   2479
    45/11   2479
    46/12   2479
    

    使用apply或transform,我得到这个错误, TypeError: sequence item 0: expected string, float found 我理解这是由于空值。我的问题是,我如何克服这一点?我需要可用值的并集并忽略null。

    1 回复  |  直到 6 年前
        1
  •  3
  •   jezrael    7 年前

    我想你需要 dropna 具有 apply , lambda 应省略:

    df=df.dropna(subset=['size']).groupby('id')['size'].apply(', '.join).reset_index(name='col')
    

    或非常相似:

    df = df['size'].dropna().groupby(df['id']).apply(', '.join).reset_index(name='col')