Панды groupby означают () не игнорируя NaNs - PullRequest
0 голосов
/ 09 января 2019

Если я вычисляю среднее значение для группового объекта и внутри одной из групп есть NaN, NaN игнорируются. Даже при применении np.mean он по-прежнему возвращает только среднее значение всех действительных чисел. Я ожидаю, что поведение NaN будет возвращаться, как только один NaN окажется в группе. Вот упрощенный пример поведения

import pandas as pd
import numpy as np
c = pd.DataFrame({'a':[1,np.nan,2,3],'b':[1,2,1,2]})
c.groupby('b').mean()
     a
b     
1  1.5
2  3.0
c.groupby('b').agg(np.mean)
     a
b     
1  1.5
2  3.0

Я хочу получить следующий результат:

     a
b     
1  1.5
2  NaN

Мне известно, что я могу заранее заменить NaN и что я, вероятно, могу написать свою собственную функцию агрегирования, которая будет возвращать NaN, как только NaN окажется в группе. Эта функция не будет оптимизирована, хотя.

Вам известен аргумент для достижения желаемого поведения с оптимизированными функциями?

Кстати, я думаю, что желаемое поведение было реализовано в предыдущей версии панд.

Ответы [ 3 ]

0 голосов
/ 09 января 2019

По умолчанию pandas пропускает значения Nan. Вы можете включить Nan, указав skipna=False:

In [215]: c.groupby('b').agg({'a': lambda x: x.mean(skipna=False)})
Out[215]: 
     a
b     
1  1.5
2  NaN
0 голосов
/ 09 января 2019

Другой подход заключается в использовании значения , которое не игнорируется по умолчанию, например np.inf:

>>> c = pd.DataFrame({'a':[1,np.inf,2,3],'b':[1,2,1,2]})
>>> c.groupby('b').mean()
          a
b          
1  1.500000
2       inf
0 голосов
/ 09 января 2019

Используйте опцию skipna -

c.groupby('b').apply(lambda g: g.mean(skipna=False))
...