Как разделить значения и поместить в следующий столбец в соответствии с условиями в пандах - PullRequest
0 голосов
/ 17 декабря 2018

enter image description here

print (df)
      Q Name Region username
15        RF  India  Karthik
12  INTERNET    NaN     Paul
9   INTERNET  India      Raj
10  INTERNET  India      Ram
11  INTERNET  China      Xin
13     TOOLS  china     Zang
14     TOOLS  china     chin

Выше необходим фрейм данных, который должен быть OUTPUT. Если все члены памяти являются индиями, тогда поместите YE в ALLINDIA. Если в памяти записаны, по крайней мере, одна Индия, поместите YE вAtleastoneINDIA Если в элементах не содержится хотя бы одна Индия, поместите YE в non_INDia

enter image description here

1 Ответ

0 голосов
/ 17 декабря 2018

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