2013-07-29 4 views
19

私はパンダのデータフレームを持っていて、それを2つの列(例えば、col1col2)でグループ化しています。 col1およびcol2の固定値(すなわち、グループの場合)については、col3にいくつかの異なる値を持つことができます。 3番目の列から別個の値の数を数えたいと思います。例えばパンダの列の異なる値をオブジェクトごとに数えるにはどうすればいいですか?

、私は私の入力としてこれを持っている場合:

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 
+0

関連トピックは[.value_counts()](https://stackoverflow.com/questions/20076195/what-is-the-most-efficient-way-of-counting-occurrences-in-pandas#20076611) – cardamom

答えて

22
df.groupby(['col1','col2'])['col3'].nunique().reset_index() 
+1

interestinですgly 'nunique'はJeffの答えの2倍の遅さです。 –

+0

奇妙な!私もそれを見ています。 Groupbyはここでは間違った経路をとっているかもしれません - グループに機能を適用するロジックはかなり密集しています。 –

+2

各グループの(単にndarrayを返す '' unique''ではなく) '' value_count''(系列を再構成する必要があります)を呼び出してオーバーヘッドが増えます。これは実際には重要ではありません。関数内でインデックスを必要としない場合は、しばしばこのペナルティを避けることができます(value_countsが実行するシリーズをインスタンス化しないで、必要なものがすべてそれであるため破棄されます) – Jeff

20
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 
関連する問題