2017-07-12 45 views
1

排除值有一个数据帧:我如何从被计算在GROUPBY功能大熊猫

AID Type  Co-AID Co-Type 
1 A   10  A 
1 A   11  B 
1 A   12  B 
1 A   13  C 
1 A   14  D 
2 X   15  A 
2 X   16  A 
2 X   17  X 
2 X   18  B 
2 X   19  X 
2 X   20  X 

我想找到共同类型的每类比它不同的百分比。

那么结果将是

AID Type PercentDiff 
    1 A 0.8  
    2 X 0.5 

0.8是因为Co-Type的4/5都不Type A

0.5是因为Co-Type的3/6都不Type X

我知道我可以根据TypeCo-Type对它们进行分组并获得每个的计数,但是如何排除与它类似的类型?

回答

2

您可以使用此:

df.assign(PercentDiff=df['Type'].ne(df['Co-Type']))\ 
    .groupby(['AID','Type'])['PercentDiff'].mean().reset_index() 

输出:

AID Type PercentDiff 
0 1 A   0.8 
1 2 X   0.5 

时序

@Psidom方法

%%timeit 
((df['Co-Type'] != df.Type) 
    .groupby([df.AID, df.Type]) 
    .apply(lambda g: g.sum()/g.size) 
    .reset_index(name="PercentDiff")) 

100个循环,最好的3:每次循环7.13毫秒

这种方法,无需拉姆达

%%timeit 
(df.assign(PercentDiff=df['Type'].ne(df['Co-Type'])) 
    .groupby(['AID','Type'])['PercentDiff'].mean().reset_index()) 

100个循环,最好的3:每次循环4.42毫秒

2

你可以这样做:

((df['Co-Type'] != df.Type) 
    .groupby([df.AID, df.Type]) 
    .apply(lambda g: g.sum()/g.size) 
    .reset_index(name="PercentDiff")) 

# AID Type PercentDiff 
#0 1  A   0.8 
#1 2  X   0.5