将lambda应用于数据框:可用于>运算符,但==会出错?

时间:2018-10-22 04:30:40

标签: python pandas numpy

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

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

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

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强制转换为浮点数,但无济于事。

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

1 个答案:

答案 0 :(得分:0)

我相信您可以将SeriesGroupBy.nuniquetransform一起用于与原始列相同的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