熊猫查找满足特定条件的每个组中的行的索引,并为这些行分配值

时间:2018-06-25 15:05:03

标签: python python-3.x pandas dataframe pandas-groupby

我有一个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

3 个答案:

答案 0 :(得分:2)

transformloc一起使用:

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)

使用pd.DataFrame.mask

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