По умолчанию операции Pandas выравнивают данные на основе их индекса .
Например, рассмотрим
In [19]: df = pd.DataFrame([(10,1),(9,2),(8,3),(7,4)], index=list('ABDC'))
In [20]: df
Out[20]:
0 1
A 10 1
B 9 2
D 8 3
C 7 4
Когда Панды оценивают df.apply(lambda x: x.sort_values())
,
генерирует серию:
In [24]: df[0].sort_values()
Out[24]:
C 7
D 8
B 9
A 10
Name: 0, dtype: int64
In [25]: df[1].sort_values()
Out[25]:
A 1
B 2
D 3
C 4
Name: 1, dtype: int64
и затем пытается объединить эти две серии в результирующий DataFrame. Это достигается путем выравнивания индексов:
In [21]: df.apply(lambda x: x.sort_values())
Out[21]:
0 1
A 10 1
B 9 2
C 7 4
D 8 3
Напротив, когда лямбда-функция возвращает массив NumPy, индекс для выравнивания отсутствует. Поэтому Pandas просто вставляет значения из массива NumPy в результирующий DataFrame в том же порядке.
Итак, когда Панды оценивают df.apply(lambda x: x.sort_values().values)
,
генерирует массивы NumPy:
In [26]: df[0].sort_values().values
Out[26]: array([ 7, 8, 9, 10])
In [27]: df[1].sort_values().values
Out[27]: array([1, 2, 3, 4])
и затем пытается объединить эти два массива NumPy в результирующий DataFrame со значениями в том же порядке
In [28]: df.apply(lambda x: x.sort_values().values)
Out[28]:
0 1
A 7 1
B 8 2
D 9 3
C 10 4