How to use argmin with groupby in pandas
argmin()
is not an agg function, you can use apply to get the closest index of every group:
txt = """ cat val
0 a 1
1 a 6
2 a 12
3 b 2
4 b 5
5 b 11
6 c 4
7 c 22"""
import io
df = pd.read_csv(io.BytesIO(txt), delim_whitespace=True, index_col=0)
df["val_delt"] = (df.val - 5.5).abs()
idx = df.groupby("cat").apply(lambda df:df.val_delt.argmin())
df.ix[idx, :]
output:
cat val val_delt
1 a 6 0.5
4 b 5 0.5
6 c 4 1.5
All answers here are somewhat correct, but none of them does it in a concise, beautiful and pythonic way. I leave here a clear way to do this.
>>> indx = df.groupby('cat')['val_delt'].idxmin()
>>> df.loc[indx]
cat val val_delt
1 a 6 0.5
4 b 5 0.5
6 c 4 1.5