Pandas group by返回NAN for apply vs transform function

时间:2017-12-14 09:34:44

标签: python pandas numpy dataframe pandas-groupby

我遇到了一些我无法解释的情况。首先是关于apply vs transform函数。到目前为止我理解,应用于整个数据帧,而变换适用于每一行,因此比应用慢。所以这是我的数据框,

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

我想使用apply,因为我有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值,我理解它。我的问题是,我怎样才能克服这个问题?我需要一个可用值的联合并忽略null。

1 个答案:

答案 0 :(得分:3)

我认为apply需要dropnalambda应该省略:

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')