Code Sample, a copy-pastable example if possible

import pandas as pd, numpy as np
df1 = pd.DataFrame({'c1':np.concatenate([np.arange(0,10000),np.arange(0,10000)]),'c2':1,'c3':'a'})

# groupby.nth(0) runs in ~11ms
%timeit x1 =df1.groupby(['c1']).nth(0, dropna='all') 
# groupby.first() runs in ~700ms
%timeit  x2 = df1.groupby(['c1']).first()

Problem description

groupby.first() takes much longer to run than groupby.nth(0), even though both operations should be equivalent. Is there any reason why the current implementation of first() shouldn't just be replaced with a call to nth()?

Output of pd.show_versions()

INSTALLED VERSIONS ------------------ commit: None python: 2.7.11.final.0 python-bits: 64 OS: Darwin OS-release: 16.7.0 machine: x86_64 processor: i386 byteorder: little LC_ALL: None LANG: en_GB.UTF-8 LOCALE: en_GB.UTF-8 pandas: 0.22.0 pytest: None pip: 9.0.1 setuptools: 36.5.0 Cython: 0.23.4 numpy: 1.14.0 scipy: 1.0.0 pyarrow: 0.8.0 xarray: None IPython: 5.5.0 sphinx: 1.5.3 patsy: 0.4.1 dateutil: 2.6.1 pytz: 2017.3 blosc: None bottleneck: 1.0.0 tables: None numexpr: 2.5 feather: 0.4.0 matplotlib: 2.1.2 openpyxl: 2.4.1 xlrd: 0.9.4 xlwt: None xlsxwriter: None lxml: 3.4.4 bs4: None html5lib: 1.0b10 sqlalchemy: 1.1.2 pymysql: None psycopg2: 2.7.3.2 (dt dec pq3 ext lo64) jinja2: 2.9.6 s3fs: None fastparquet: None pandas_gbq: None pandas_datareader: None

Comment From: jreback

you would have to actually show the times, this is not reproducible. .first() is cythonized and should actually be faster.

In [1]: import pandas as pd, numpy as np
   ...: df1 = pd.DataFrame({'c1':np.concatenate([np.arange(0,10000),np.arange(0,10000)]),'c2':1,'c3':'a'})
   ...: 
   ...: # groupby.nth(0) runs in ~11ms
   ...: %timeit x1 =df1.groupby(['c1']).nth(0, dropna='all') 
   ...: # groupby.first() runs in ~700ms
   ...: %timeit  x2 = df1.groupby(['c1']).first()
   ...: 
6.37 ms +- 154 us per loop (mean +- std. dev. of 7 runs, 100 loops each)
2.26 ms +- 46.6 us per loop (mean +- std. dev. of 7 runs, 100 loops each)

you are probably seeing #19283 which is a fixed regression in 0.23

Comment From: gaworecki5

I noticed this problem on a df of about 2 million rows. groupby.first() would not run at all, other aggregations like count() and sum() run in a few seconds. I did not know about nth(0) until this thread but it runs in 20 seconds. Did anyone figure out the reason this is?