При применении агрегирования к сгруппированному фрейму данных pandas агрегированные выходные данные содержат разные значения для агрегированных столбцов со всеми пропущенными значениями, в зависимости от типа столбца фрейма данных. Ниже приведен минимальный пример, содержащий одно непропущенное значение (целое число, строку и кортеж), одно значение NaN и одно значение None каждое:
Код: Выделить всё
import pandas as pd
import numpy as np
a1 = pd.DataFrame({'a': [3, np.nan, None], 'b': [0,1,2]})
a2 = pd.DataFrame({'a': ['tree', np.nan, None], 'b': [0,1,2]})
a3 = pd.DataFrame({'a': [(0,1,2), np.nan, None], 'b': [0,1,2]})
a1.groupby('b')['a'].first()
a2.groupby('b')['a'].first()
a3.groupby('b')['a'].first()
a1.groupby('b')['a'].agg('first')
a2.groupby('b')['a'].agg('first')
a3.groupby('b')['a'].agg('first')
Глядя на dtypes столбца 'a', можно увидеть, что это float64, object и object< /code> для a1, a2 и a3 соответственно. None в a1 преобразуется в NaN при создании кадра данных. Поэтому я бы имел следующее
Ожидаемое поведение вывода:
- : NaN для строк 1 и 2 (это так)
- : NaN и None для строк 1 и 2 (не так)
- : NaN и None для строк 1 и 2 (не тот случай)
Фактический результат :
Код: Выделить всё
b
0 3.0
1 NaN
2 NaN
Name: a, dtype: float64
b
0 tree
1 None
2 None
Name: a, dtype: object
b
0 (0, 1, 2)
1 None
2 None
Name: a, dtype: object
Почему агрегация изменяет данные с NaN на None для строки 1 в a2 и a3?< /strong> Поскольку столбец в любом случае относится к объекту dtype, не должно возникнуть проблем с возвратом NaN и None для строк 1 и 2 соответственно; и здесь мы не находимся в сценарии, в котором любая агрегируемая группа содержит как NaN, так и None. Документация (
https://pandas.pydata.org/docs/referenc ... first.html) также не очень точна в отношении этого поведения, она просто упоминает возвращаемое значение для всех NA. -столбцы — нет данных.
Подробнее здесь:
https://stackoverflow.com/questions/790 ... -dataframe