Как упоминал Джон Клементс:
In [3]: s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])
In [4]: x, y = s.agg(['max', 'idxmax'])
In [5]: x
Out[5]: 1.6339096862287581
In [6]: y
Out[6]: 'b'
In [7]: s
Out[7]: a 1.245039
b 1.633910
c 0.619384
d 0.369604
e 1.009942
dtype: float64
В ответ на запрос кортежа:
def max_and_index(series):
"""Return a tuple of (max, idxmax) from a pandas.Series"""
x, y = series.agg(['max', 'idxmax'])
return x, y
t = max_and_idxmax(s)
print(t)
(1.6339096862287581, 'b')
print(type(t))
<class 'tuple'>
Еще меньше:
def max_and_idxmax(series):
"""Return a tuple of (max, idxmax) from a pandas.Series"""
return series.max(), series.idxmax()
Если вам нужна скорость, используйте метод NumPy выше
import pandas as pd
import numpy as np
def max_and_index(series):
x, y = series.agg(['max', 'idxmax'])
return x, y
def max_and_idxmax(series):
return series.max(), series.idxmax()
def np_max_and_argmax(series):
return np.max(series.values), np.argmax(series.values)
def Max_Argmax(series):
v = series.values
i = series.index
arg = np.argmax(v)
return v[arg], i[arg]
a = []
for i in range(2,9,1):
a.append(pd.Series(np.random.randint(0, 100, size=10**i)))
print('{}\t{:>11,}'.format(i-2, 10**i))
# 0 100
# 1 1,000
# 2 10,000
# 3 100,000
# 4 1,000,000
# 5 10,000,000
# 6 100,000,000
idx = 5
%%timeit -n 2 -r 10
max_and_index(a[idx])
# 144 ms ± 5.45 ms per loop (mean ± std. dev. of 10 runs, 2 loops each)
%%timeit -n 2 -r 10
max_and_idxmax(a[idx])
# 143 ms ± 5.14 ms per loop (mean ± std. dev. of 10 runs, 2 loops each)
%%timeit -n 2 -r 10
Max_Argmax(a[idx])
# 9.89 ms ± 1.13 ms per loop (mean ± std. dev. of 10 runs, 2 loops each)
%%timeit -n 2 -r 10
np_max_and_argmax(a[idx])
# 24.5 ms ± 1.74 ms per loop (mean ± std. dev. of 10 runs, 2 loops each)