Создать новый столбец на основе функции группировки - PullRequest
1 голос
/ 06 января 2020

У меня есть фрейм данных:

df1 = pd.DataFrame({'Name': ['Bob', 'Bob', 'Bob', 'Joe', 'Joe', 'Joe', 'Alan', 'Alan', 'Steve', 'Steve'],
                'ID': [1,2,3,4,5,6,7,8,9,10],
                'Value': ['Y','Y','Y','N','N','N','Y','N','N','Y']})


Name    ID    Value   
 Bob     1       Y          
 Bob     2       Y          
 Bob     3       Y          
 Joe     4       N          
 Joe     5       N          
 Joe     6       N
 Alan    7       Y
 Alan    8       N
 Steve   9       N
 Steve   10      Y

Мне нужно вычислить новый столбец Result, который имеет следующее правило. Для каждой группы Name Боб, Джо и др. c., Если каждый Value равен 'Y', присвойте каждому значению Y в новом столбце. В противном случае присвойте ему 'N'.

Итак, идеальный вывод:

 Name    ID    Value   Result
 Bob     1       Y       Y
 Bob     2       Y       Y  
 Bob     3       Y       Y  
 Joe     4       N       N  
 Joe     5       N       N  
 Joe     6       N       N
 Alan    7       Y       N
 Alan    8       N       N
 Steve   9       N       N
 Steve   10      Y       N

Это то, что у меня пока есть, но не работает правильно.

df1['Result'] = df1.groupby('Name').Value.all().reindex(df1.Name).astype(str).values
df1

Ответы [ 2 ]

2 голосов
/ 06 января 2020

Используйте numpy.where с GroupBy.transform для Series с таким же размером, как у оригинала и GroupBy.all:

df1['Result'] = np.where(df1['Value'].eq('Y').groupby(df1['Name']).transform('all'), 'Y', 'N')

Альтернатива:

mask = df1['Value'].eq('Y').groupby(df1['Name']).transform('all')
df1.loc[~mask, 'Value'] = 'N'

Или получить все группы по крайней мере N и заменить на N на mask на Series.isin:

mask = df1['Name'].isin(df1.loc[df1['Value'].eq('N'), 'Name'])
df1.loc[mask, 'Value'] = 'N'

print (df1)
    Name  ID Value
0    Bob   1     Y
1    Bob   2     Y
2    Bob   3     Y
3    Joe   4     N
4    Joe   5     N
5    Joe   6     N
6   Alan   7     N
7   Alan   8     N
8  Steve   9     N
9  Steve  10     N
1 голос
/ 06 января 2020

Вы были близки! Вот как вы можете это сделать:

df1["Result"] = df1.groupby("Name").Value.transform(lambda value: all(value == "Y"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...