Панды: получить минимальное значение между 2 столбцами данных - PullRequest
9 голосов
/ 12 апреля 2019

У меня есть 2 столбца, и я хочу, чтобы 3-й столбец был минимальным значением между ними. Мои данные выглядят так:

   A  B
0  2  1
1  2  1
2  2  4
3  2  4
4  3  5
5  3  5
6  3  6
7  3  6

И я хочу получить столбец C следующим образом:

   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

Код помощи:

df = pd.DataFrame({'A': [2, 2, 2, 2, 3, 3, 3, 3],
                   'B': [1, 1, 4, 4, 5, 5, 6, 6]})

Спасибо!

1 Ответ

12 голосов
/ 12 апреля 2019

Использование 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...