根据其他列上的条件对熊猫进行分组

时间:2019-02-04 15:02:51

标签: pandas

import pandas as pd    
df = pd.DataFrame(columns=['A','B'])   
df['A']=['A','B','A','A','B','B','B'] 
df['B']=[2,4,3,5,6,7,8]  

df   
   A  B  
0  A  2    
1  B  4  
2  A  3  
3  A  5  
4  B  6  
5  B  7  
6  B  8 

df.columns=['id','num']  

df 
  id  num  
0  A    2  
1  B    4  
2  A    3  
3  A    5  
4  B    6  
5  B    7  
6  B    8 

我想对id列应用groupby,但对num列应用某些条件
我想在最终数据帧中有2列is_even_count和is_odd_count列,其中is_even_count仅对分组后num列中的偶数进行计数,而is_odd_count仅对分组后num列中的奇数进行计数。

我的输出将是

   is_even_count  is_odd_count  
A  1  2  
B  3  1  

我该怎么在熊猫上做

1 个答案:

答案 0 :(得分:0)

使用除以2的模数,然后将1map进行比较:

d = {True:'is_odd_count', False:'is_even_count'}
df = df.groupby(['id', (df['num'] % 2 == 1).map(d)]).size().unstack(fill_value=0)
print (df)
num  is_even_count  is_odd_count
id                              
A                1             2
B                3             1

使用crosstab的另一种解决方案:

df = pd.crosstab(df['id'], (df['num'] % 2 == 1).map(d))

替代numpy.where

a = np.where(df['num'] % 2 == 1, 'is_odd_count', 'is_even_count')
df = pd.crosstab(df['id'], a)