首页 > 解决方案 > pandas 查找每个组中满足特定条件的行的索引并将值分配给这些行

问题描述

我有一个df

name_id name
1       a
2       b
2       b
3       c
3       c
3       c

现在我想groupby name_id分配-1给组中的行,其长度为 1 或 < 2;

    one_occurrence_indices = df.groupby('name_id').filter(lambda x: len(x) == 1).index.tolist()

    for index in one_occurrence_indices:
        df.loc[index, 'name_id'] = -1

我想知道最好的方法是什么。所以结果df

name_id name
-1       a
 2       b
 2       b
 3       c
 3       c
 3       c

标签: pythonpython-3.xpandasdataframepandas-groupby

解决方案


transform与 一起使用loc

df.loc[df.groupby('name_id')['name_id'].transform('size') == 1, 'name_id'] = -1

替代方案是numpy.where

df['name_id'] = np.where(df.groupby('name_id')['name_id'].transform('size') == 1, 
                         -1, df['name_id'])

print (df)
   name_id name
0       -1    a
1        2    b
2        2    b
3        3    c
4        3    c
5        3    c

此外,如果想要测试重复使用duplicated

df['name_id'] = np.where(df.duplicated('name_id', keep=False), df['name_id'], -1)

推荐阅读