【问题标题】:Pandas group by returns NAN for apply vs transform functionPandas group by 为 apply vs transform 函数返回 NAN
【发布时间】:2018-05-28 08:21:08
【问题描述】:

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

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

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

【问题讨论】:

  • 也许您正在寻找聚合,即df.groupby('id')['size'].agg(lambda col: ', '.join(col))

标签: python pandas numpy dataframe pandas-groupby


【解决方案1】:

我认为你需要dropnaapplylambda 应该省略:

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

【讨论】:

  • 惊人的@jezrael。只是又一题。由于它返回 2 个项目,我无法分配 df['jointed_size']。还有什么是用熊猫学习大量 csv 操作的最佳方法?我会接受你的回答。
  • 然后使用df['jointed_size'] = df['size'].dropna().groupby(df['id']).transform(', '.join) - 获取NaNs 以获取缺少的size 值。
猜你喜欢
  • 2023-03-29
  • 2014-04-26
  • 2015-07-09
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多