Если вы посмотрите на базовый массив numpy
, вы увидите, что скорость доступа к строкам / столбцам одинакова, по крайней мере, в моем тесте:
%timeit df.values[0]
# 10.2 µs ± 596 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit df.values[:, 0]
# 10.2 µs ± 730 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
Ряды (столбцы) - это больше первоклассных граждан в кадре данных, чем строки. Я думаю, что доступ к столбцам больше похож на поиск по словарю, поэтому он такой быстрый. Обычно есть несколько столбцов, и каждый имеет смысл, поэтому имеет смысл хранить их таким образом. Тем не менее, часто очень много строк, и отдельный ряд не имеет такого большого значения. Это немного догадка, хотя. Вам нужно будет взглянуть на исходный код, чтобы увидеть, что на самом деле вызывается каждый раз, и определить, почему операции занимают разное время - возможно, ответ появится позже.
Вот еще одно сравнение по времени:
%timeit df.iloc[0, :]
# 141 µs ± 7 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit df.iloc[:, 0]
# 61.9 µs ± 1.76 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
Доступ к столбцам также происходит быстрее, хотя и значительно медленнее. Я не уверен, что это объяснит. Я предполагаю, что замедление по сравнению с доступом к строке / столбцу напрямую связано с необходимостью возврата pd.Series
. При доступе к строке, возможно, потребуется создать новый pd.Series
. Но я не знаю, почему iloc
медленнее и для столбцов - возможно, он также каждый раз создает новую серию, поскольку iloc
может использоваться довольно гибко и может не возвращать существующую серию (или может возвращать фрейм данных). Но если новая серия создается оба раза, то я снова в недоумении, почему одна операция превосходит другую.
И для большей полноты
%timeit df.loc[0, :]
# 155 µs ± 6.48 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit df.loc[:, 0]
# 35.6 µs ± 1.28 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)