我正在尝试从组对象中替换在特定列中具有多个唯一值的组。 这行有效,并在列中使用> 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强制转换为浮点数,但无济于事。
如果有更好的方法来完成相同的任务,那也会有所帮助。
答案 0 :(得分:0)
我相信您可以将SeriesGroupBy.nunique
与transform
一起用于与原始列相同的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