Pandas находит индексы строк в каждой группе, которые соответствуют определенным условиям, и присваивает значения этим строкам - PullRequest
0 голосов
/ 25 июня 2018

У меня есть df,

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

, теперь я хочу groupby name_id и назначить -1 для строк в группе (группах), длина которых равна 1 или <2; </p>

    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 голосов
/ 25 июня 2018

Использование:

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
0 голосов
/ 25 июня 2018

Использование 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
0 голосов
/ 25 июня 2018

Используйте 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...