Add 'key' keyword argument to max/min methods, akin to python's builtin max/min
See https://docs.python.org/3/library/functions.html#max

Specifying a `key=` function F to use indicates you want to return the `val` with the largest `F(val)`, as opposed to returning the largest val or returning the largest F(val).

The following code should work:

```
>>> pd.DataFrame([1, 3, 5, 7]).max(key=lambda e: e % 3)
5
```

For the same reason that this works:

```
>>> max([1, 3, 5, 7], key=lambda e: e % 3)
5
```

Currently, it is necessary to use workarounds such as create temporary copies of the output of the function:

```
>>> df = pd.DataFrame([1, 3, 5, 7])
>>> k = df.apply(lambda e: e % 3).idxmax()
>>> df[0][k]
5
```