Pandas 按 returns NAN 分组以应用 vs 变换函数
Pandas group by returns NAN for apply vs transform function
我遇到了一些我自己无法解释的情况。第一件事是关于 apply vs transform 函数。到目前为止,我了解到,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))
它 returns
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
使用应用或转换时,出现此错误,
TypeError: sequence item 0: expected string, float found
我理解它是由于空值。我的问题是,我怎样才能克服这个问题?我需要可用值的并集并忽略空值。
我认为你需要 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')
我遇到了一些我自己无法解释的情况。第一件事是关于 apply vs transform 函数。到目前为止,我了解到,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))
它 returns
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
使用应用或转换时,出现此错误,
TypeError: sequence item 0: expected string, float found
我理解它是由于空值。我的问题是,我怎样才能克服这个问题?我需要可用值的并集并忽略空值。
我认为你需要 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')