use master/0.14 (coming shortly), vastly speeds up count, see here
here's the benchmark on master/0.14 vs 0.13.1:
Setup
In [1]: n = 10000
In [2]: offsets = np.random.randint(n, size=n).astype('timedelta64[ns]')
In [3]: dates = np.datetime64('now') + offsets
In [4]: dates[np.random.rand(n) > 0.5] = np.datetime64('nat')
In [5]: offsets[np.random.rand(n) > 0.5] = np.timedelta64('nat')
In [6]: value2 = np.random.randn(n)
In [7]: value2[np.random.rand(n) > 0.5] = np.nan
In [8]: obj = pd.util.testing.choice(['a', 'b'], size=n).astype(object)
In [9]: obj[np.random.randn(n) > 0.5] = np.nan
In [10]: df = DataFrame({'key1': np.random.randint(0, 500, size=n),
....: 'key2': np.random.randint(0, 100, size=n),
....: 'dates': dates,
....: 'value2' : value2,
....: 'value3' : np.random.randn(n),
....: 'obj': obj,
....: 'offsets': offsets})
v0.13.1
In [11]: %timeit df.groupby(['key1', 'key2']).count()
1 loops, best of 3: 5.41 s per loop
v0.14.0
In [11]: %timeit df.groupby(['key1', 'key2']).count()
100 loops, best of 3: 6.25 ms per loop