Использование df.min(axis=1)
df['c'] = df.min(axis=1)
df
Out[41]:
A B c
0 2 1 1
1 2 1 1
2 2 4 2
3 2 4 2
4 3 5 3
5 3 5 3
6 3 6 3
7 3 6 3
Возвращает мин по строкам (при прохождении axis=1
)
Для не гетерогенных dtypes и больших dfs вы можете использовать numpy.min
, что будет быстрее:
In[42]:
df['c'] = np.min(df.values,axis=1)
df
Out[42]:
A B c
0 2 1 1
1 2 1 1
2 2 4 2
3 2 4 2
4 3 5 3
5 3 5 3
6 3 6 3
7 3 6 3
тайминги
In[45]:
df = pd.DataFrame({'A': [2, 2, 2, 2, 3, 3, 3, 3],
'B': [1, 1, 4, 4, 5, 5, 6, 6]})
df = pd.concat([df]*1000, ignore_index=True)
df.shape
Out[45]: (8000, 2)
Итак, для строки 8K df:
%timeit df.min(axis=1)
%timeit np.min(df.values,axis=1)
314 µs ± 3.63 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
34.4 µs ± 161 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
Вы можете видеть, что NumPy версия почти в 10 раз быстрее (обратите внимание, я пропускаю df.values
, поэтому мы пропускаем NUMPY массив), это станет более важным фактором, когда мы доберемся до еще большего DFS
Примечание
для версий 0.24.0
или выше, используйте to_numpy()
так что выше становится:
df['c'] = np.min(df.to_numpy(),axis=1)
Задержка
%timeit df.min(axis=1)
%timeit np.min(df.values,axis=1)
%timeit np.min(df.to_numpy(),axis=1)
314 µs ± 3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
35.2 µs ± 680 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
35.5 µs ± 262 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
Существует небольшое расхождение между .values
и to_numpy()
, это зависит от того, знаете ли вы заранее, что dtype не смешан, и что вероятный dtype является фактором, например, float 16
против float 32
см. Эту ссылку для дальнейшего объяснения. Панды делают немного больше проверки при звонке to_numpy