在熊猫中使用groupby时检查某些列的值

时间:2020-01-03 15:33:11

标签: python pandas dataframe group-by

我有一个这样的数据框

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'])

2 个答案:

答案 0 :(得分:4)

allgroupby+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

答案 1 :(得分:2)

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