Давайте начнем с рассмотрения некоторых простых вычислений группировки, чтобы понять, как pandas работает с ним.
В следующем случае ключи группировки используются в качестве индекса в результирующем объекте Series
. Исходный индекс был отброшен.
In [4]: df1.groupby('group_col')['value_col'] \
...: .apply(lambda x: {'sum': x.sum(), 'mean': x.mean()})
Out[4]:
group_col
0.0 sum 6.0
mean 2.0
Name: value_col, dtype: float64
In [5]: df2.groupby('group_col')['value_col'] \
...: .apply(lambda x: {'sum': x.sum(), 'mean': x.mean()})
Out[5]:
group_col
0.0 sum 6.0
mean 2.0
Name: value_col, dtype: float64
В следующем случае индекс исходного DataFrame
сохраняется. Ключи группировки не содержатся в результате Series
.
In [6]: df1.groupby('group_col')['value_col'].apply(lambda x: x / len(x))
Out[6]:
0 0.666667
1 NaN
2 0.666667
3 0.666667
Name: value_col, dtype: float64
In [7]: df2.groupby('group_col')['value_col'].apply(lambda x: x / len(x))
Out[7]:
0 NaN
1 0.666667
2 0.666667
3 0.666667
Name: value_col, dtype: float64
Что заставляет pandas вести себя по-другому, когда он создает индекс комбинированного объекта?
На самом деле это основано на , был ли индекс изменен агрегированием или нет . Если индекс исходного объекта и результирующего объекта совпадает, он решает повторно использовать исходный индекс. С другой стороны, когда индекс отличается от исходного объекта, он использует ключ группы в индексе для формирования MultiIndex
.
Теперь, возвращаясь к вопросу, обратите внимание, что индекс был заменено на df1
. Для группового ключа 0.0
индекс исходного фрагмента был [0, 2, 3]
, тогда как после агрегирования он равен [1, 2, 3]
. Однако для df2
исходный индекс был [1, 2, 3]
, и случайно он не был изменен агрегированием.