Python 如何按对象计算分组列中的不同值?

Python 如何按对象计算分组列中的不同值?,python,group-by,pandas,Python,Group By,Pandas,我有一个pandas数据框,并将其分为两列(例如col1和col2)。对于col1和col2的固定值(即一个组),我可以在col3中有几个不同的值。我想计算第三列中不同值的数量 例如,如果我将此作为输入: 1 1 1 1 1 1 1 1 2 1 2 3 1 2 3 1 2 3 2 1 1 2 1 2 2 1 3 2 2 3 2 2 3 2 2 3 我希望将此表(数据框)作为输出: 1 1 2 1 2 1 2 1 3 2 2 1

我有一个pandas数据框,并将其分为两列(例如
col1
col2
)。对于
col1
col2
的固定值(即一个组),我可以在
col3
中有几个不同的值。我想计算第三列中不同值的数量

例如,如果我将此作为输入:

1  1  1
1  1  1
1  1  2
1  2  3
1  2  3
1  2  3
2  1  1
2  1  2
2  1  3
2  2  3
2  2  3
2  2  3
我希望将此表(数据框)作为输出:

1  1  2
1  2  1
2  1  3
2  2  1

有趣的是,
nunique
似乎比杰夫的回答慢了一倍。奇怪!我也看到了。Groupby可能在这里采用了错误的所谓路径——将函数应用于组的逻辑相当密集。在每个组上调用
value\u count
(必须重建序列)比调用仅返回一个数组的
unique
开销更大。这实际上是非常重要的。如果您不需要函数内部的索引,那么您通常可以避免这种惩罚(通过不实例化序列,值_计数,然后被丢弃,因为您只需要它的长度),在0.18.0中使用nunique()似乎是最佳的
df.groupby(['col1','col2'])['col3'].nunique().reset_index()
In [17]: df
Out[17]: 
    0  1  2
0   1  1  1
1   1  1  1
2   1  1  2
3   1  2  3
4   1  2  3
5   1  2  3
6   2  1  1
7   2  1  2
8   2  1  3
9   2  2  3
10  2  2  3
11  2  2  3

In [19]: df.groupby([0,1])[2].apply(lambda x: len(x.unique()))
Out[19]: 
0  1
1  1    2
   2    1
2  1    3
   2    1
dtype: int64