如何排除值在pandas中的groupby函数中计数

时间:2017-07-12 15:28:21

标签: python pandas dataframe

我有一个数据框:

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

我想找到与每种类型不同的Co-Types的百分比。

所以结果将是

  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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 Method

%%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 ms

此方法没有lambda

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

100个循环,最佳3:每循环4.42 ms