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

df = pd.DataFrame({'Name': ['Bob', 'Bob', 'Bob', 'Joe', 'Joe', 'Joe'],
                'ID': [1,2,3,4,5,6],
                'Value': [1,1,1,0,0,1]})
df

 Name    ID    Value   
 Bob     1       1          
 Bob     2       1          
 Bob     3       1          
 Joe     4       0          
 Joe     5       0          
 Joe     6       1          

Цель состоит в том, чтобы вычислить столбец result. Это делается путем проверки каждой группы в столбце name, в данном случае Bob & Joe.

Таким образом, для каждой группы, если все значения в столбце value являются 1, значения в столбце result для этой группы будут равны 1. Если все значения равны 0, Значения столбца result для этой группы будут равны всем 0. И если значения представляют собой сочетание 1 и 0, столбец result для этой группы будет равен всем 0.

Итак, результат должен выглядеть так:

Name    ID    Value    Result
 Bob     1       1       1   
 Bob     2       1       1   
 Bob     3       1       1   
 Joe     4       0       0   
 Joe     5       0       0   
 Joe     6       1       0   

Трудность заключается в создании этих групп и последующей проверке каждой из них.

Моя попытка:

df = df.groupby('Name')

df['Result'] = df.apply(lambda x: x['Value'])
3
Mazz 3 Янв 2020 в 18:33

2 ответа

Лучший ответ

Используйте all с groupby+transform:

df['Result'] = df.groupby('Name')['Value'].transform('all').astype(int)
# or df['Result'] = df['Value'].eq(1).groupby(df['Name']).transform('all').astype(int)
print(df)

  Name  ID  Value  Result
0  Bob   1      1       1
1  Bob   2      1       1
2  Bob   3      1       1
3  Joe   4      0       0
4  Joe   5      0       0
5  Joe   6      1       0
3
anky_91 3 Янв 2020 в 15:35

IIUC

df['Result']=df.groupby('Name').Value.all().reindex(df.Name).astype(int).values
df
Out[57]: 
  Name  ID  Value  Result
0  Bob   1      1       1
1  Bob   2      1       1
2  Bob   3      1       1
3  Joe   4      0       0
4  Joe   5      0       0
5  Joe   6      1       0
2
YO and BEN_W 3 Янв 2020 в 15:36