Python pandas查找每个组中满足特定条件的行的索引,并为这些行赋值

Python pandas查找每个组中满足特定条件的行的索引,并为这些行赋值,python,python-3.x,pandas,dataframe,pandas-groupby,Python,Python 3.x,Pandas,Dataframe,Pandas Groupby,我有一个df name_id name 1 a 2 b 2 b 3 c 3 c 3 c name_id name -1 a 2 b 2 b 3 c 3 c 3 c 现在我想groupbyname\u id并将-1分配给组中长度为1或

我有一个
df

name_id name
1       a
2       b
2       b
3       c
3       c
3       c
name_id name
-1       a
 2       b
 2       b
 3       c
 3       c
 3       c
现在我想
groupby
name\u 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
name_id name
-1       a
 2       b
 2       b
 3       c
 3       c
 3       c
loc一起使用

df.loc[df.groupby('name_id')['name_id'].transform('size') == 1, 'name_id'] = -1
备选方案是:

此外,如果需要测试副本,请使用:

使用:

使用:

lens=df.groupby('name_id')['name'].transform(len)
df['name_id'].遮罩(镜头<2,-1,在位=真)
打印(df)
姓名
0-1 a
1.2 b
2 b
3 c
4.3 c
5.3 c
df.name_id*=(df.groupby('name_id').name.transform(len)==1).map({True:-1,False:1})
df
Out[50]: 
   name_id name
0       -1    a
1        2    b
2        2    b
3        3    c
4        3    c
5        3    c
lens = df.groupby('name_id')['name'].transform(len)

df['name_id'].mask(lens < 2, -1, inplace=True)

print(df)

   name_id name
0       -1    a
1        2    b
2        2    b
3        3    c
4        3    c
5        3    c