Сравните по eq
(==
) для логической маски и агрегируйте по agg
и функциям all
any
, затем создайте новый столбец с помощью инвертированной any
функции для строк и продолжительностью add_suffix
:
df1 = (df['Region'].eq('India')
.groupby(df['Q Name'])
.agg(['all','any'])
.assign(non= lambda x: ~x.any(axis=1))
.add_suffix('_india'))
print (df1)
all_india any_india non_india
Q Name
INTERNET False True False
RF True True False
TOOLS False False True
Также возможна небольшая модификация для изменения True
сany
если также в all
столбце:
df1 = (df['Region'].eq('India')
.groupby(df['Q Name'])
.agg(['all','any'])
.assign(non= lambda x: ~x.any(axis=1),
any = lambda x: x['any'] & ~x['all'])
.add_suffix('_india'))
print (df1)
all_india any_india non_india
Q Name
INTERNET False True False
RF True False False
TOOLS False False True
Последний для yes
значений использовать numpy.where
:
df2 = pd.DataFrame(np.where(df1, 'yes', ''),
index=df1.index,
columns=df1.columns)
print (df2)
all_india any_india non_india
Q Name
INTERNET yes
RF yes
TOOLS yes