首页 > 解决方案 > 将 lambda 应用于数据框:与 > 运算符一起使用,但使用 == 时出错?

问题描述

我正在尝试从在特定列中具有多个唯一值的组对象中替换组。此行有效,并替换列中具有 >1 个唯一值的组:

df.groupby(['ID'])\
  .apply(lambda group: group if len(set(group['col_name'])) > 1 else np.NaN)

但是,如果我只是将 lambda 中的运算符更改为==(or <=),它将失败:

df.groupby(['ID'])\
  .apply(lambda group: group if len(set(group['col_name'])) == 1 else np.NaN)

导致: AttributeError: 'float' object has no attribute '_get_axis'

我无法将此错误连接到我的实现,我尝试将 1 转换为浮点数无济于事。

如果有更好的方法来完成同样的任务,那也会有所帮助。

标签: pythonpandasnumpy

解决方案


我相信您可以将SeriesGroupBy.nuniquewithtransform用于与Series原始列相同的列,因此可以通过以下方式比较和替换值where

df = pd.DataFrame({
        'col_name':list('abcdef'),
         'ID':list('aaabbc')
})

df['col_name'] =  df['col_name'].where(df.groupby('ID')['col_name'].transform('nunique') > 1)

另一个解决方案numpy.where

m = df.groupby('ID')['col_name'].transform('nunique') > 1
df['col_name'] =  np.where(m, df['col_name'], np.nan)

print (df)
  col_name ID
0        a  a
1        b  a
2        c  a
3        d  b
4        e  b
5      NaN  c

推荐阅读