我有一个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
答案 0 :(得分:2)
将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)
答案 1 :(得分:1)
使用:
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
答案 2 :(得分:1)
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