熊猫独特的计数列

时间:2016-01-06 21:11:27

标签: python-3.x pandas

this帖子的启发,我想在每个分组的数据框中获得一个值的明确计数,并在数据框中创建一个具有不同计数值的列。 像这样:

原始数据框:

import pandas as pd
df = pd.DataFrame(
    {'A' : ['foo', 'foo', 'foo', 'foo',
            'bar', 'bar', 'bar', 'bar'],
     'B' : ['foo', 'fo', 'foo', 'foo',
        'bar', 'bar', 'ba', 'ba'],
     'C' : [2, 4, 4, 2, 5, 4, 3, 2]})
df

    A       B       C
0   foo     foo     2
1   foo     fo      4
2   foo     foo     4
3   foo     foo     2
4   bar     bar     5
5   bar     bar     4
6   bar     ba      3
7   bar     ba      2

应用链接帖子的方法:

df=df.groupby(['A','B'])['C'].apply(lambda x: len(x.unique()))
df

每个关联帖子方法的结果:

A    B  
bar  ba     2
     bar    2
foo  fo     1
     foo    2
Name: C, dtype: int64

期望的结果:

    A       B       C   Distinct Count of C per A and B
0   foo     foo     2             2 
1   foo     fo      4             1 
2   foo     foo     4             2 
3   foo     foo     2             2
4   bar     bar     5             2 
5   bar     bar     4             2
6   bar     ba      3             2
7   bar     ba      2             2 

看第一行," foo"在" A"和" foo" in" B"有2个与之关联的唯一值(2和4),对于A列和B列的值组合,每行产生2个。

提前感谢!

1 个答案:

答案 0 :(得分:1)

使用transform代替apply,因为它返回的列大小与原始版本相同,我无法找到原始pandas site的文档,但是来自帮助:

  

转换(func,* args,** kwargs)方法   pandas.core.groupby.SeriesGroupBy实例
      调用函数在每个组上生成一个类似索引的系列并返回       具有转换值的系列

df['Distinct Count of C per A and B'] = df.groupby(['A','B'])['C'].transform(lambda x: len(x.unique()))

In [1495]: df
Out[1495]: 
     A    B  C  Distinct Count of C per A and B
0  foo  foo  2                                2
1  foo   fo  4                                1
2  foo  foo  4                                2
3  foo  foo  2                                2
4  bar  bar  5                                2
5  bar  bar  4                                2
6  bar   ba  3                                2
7  bar   ba  2                                2