Code Sample

df = pd.DataFrame({'A':['a','b']})
df['B'] = None
df.groupby('A').B.rank(method='first') # works
df.B[0] = 1
df.groupby('A').B.rank(method='first') # ValueError!
df.B = df.B.astype(float)
df.groupby('A').B.rank(method='first') # works again

Problem description

The inconsistent behavior of groupby.rank(method='first'). It works in all three cases in the above if the method keyword 'first' is dropped.

Expected Output

Output of pd.show_versions()

# Paste the output here pd.show_versions() here INSTALLED VERSIONS ------------------ commit: None python: 3.6.1.final.0 python-bits: 64 OS: Windows OS-release: 7 machine: AMD64 processor: Intel64 Family 6 Model 94 Stepping 3, GenuineIntel byteorder: little LC_ALL: None LANG: None LOCALE: None.None pandas: 0.20.1 pytest: 3.0.7 pip: 9.0.1 setuptools: 27.2.0 Cython: 0.25.2 numpy: 1.12.1 scipy: 0.19.0 xarray: None IPython: 5.3.0 sphinx: 1.5.6 patsy: 0.4.1 dateutil: 2.6.0 pytz: 2017.2 blosc: None bottleneck: 1.2.1 tables: 3.2.2 numexpr: 2.6.2 feather: None matplotlib: 2.0.2 openpyxl: 2.4.7 xlrd: 1.0.0 xlwt: 1.2.0 xlsxwriter: 0.9.6 lxml: 3.7.3 bs4: 4.6.0 html5lib: 0.999 sqlalchemy: 1.1.10 pymysql: None psycopg2: None jinja2: 2.9.6 s3fs: None pandas_gbq: None pandas_datareader: None

Comment From: gfyoung

@jongmmm : Could you display the output and traceback from each of those calls?

Comment From: jreback

this is a dupe of #11759. The solution is to actually define a .rank method, rather than letting this auto-generate (with the incorrect arguments).