Присвойте значение новому столбцу на основе значения других столбцов pandas - PullRequest
1 голос
/ 17 апреля 2020

Этот вопрос кажется повторением и на него уже давали ответ, но это немного сложно.

Допустим, у меня есть следующий фрейм данных.

Id     Col_1
1     aaa 
1     ccc 
2     bbb 
3     aa  

На основе столбца значений Id и Col_1 я хочу создать новый столбец и назначить новое значение, проверив наличие aa в Col_1. И это значение должно применяться на основе Id средств, если они имеют одинаковый идентификатор.

Ожидаемый результат:

Id   Col_1  New_Column
1     aaa    aa
1     ccc    aa
2     bbb    
3     aa    aa

Я попробовал это с этим:

df['New_Column'] = ((df['Id']==1) | df['Col_1'].str.contains('aa')).map({True:'aa', False:''})

, и результат будет

Id   Col_1  New_Column
1     aaa    aa
1     ccc    
2     bbb    
3     aa    aa

Но как я упомянул выше, я хочу назначить aa для нового столбца с тем же Id.

Кто-нибудь может помочь с этим?

1 Ответ

3 голосов
/ 17 апреля 2020

Используйте GroupBy.transform с GroupBy.any для получения маски для всех групп хотя бы с одним aaa:

mask = df['Col_1'].str.contains('aa').groupby(df['Id']).transform('any')

Альтернатива с Series.isin и фильтрация Id значений по aa:

mask = df['Id'].isin(df.loc[df['Col_1'].str.contains('aa'), 'Id'])

df['New_Column'] = np.where(mask, 'aa','')
print (df)
   Id Col_1 New_Column
0   1   aaa         aa
1   1   ccc         aa
2   2   bbb           
3   3    aa         aa

РЕДАКТИРОВАНИЕ:

mask1 = df['Id'].isin(df.loc[df['Col_1'].str.contains('aa'), 'Id'])
mask2 = df['Id'].isin(df.loc[df['Col_1'].str.contains('bb'), 'Id'])

df['New_Column'] = np.select([mask1, mask2], ['aa','bb'],'')
print (df)
   Id Col_1 New_Column
0   1   aaa         aa
1   1   ccc         aa
2   2   bbb         bb
3   3    aa         aa
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...