Найти минимум без нуля и NaN в Pandas Dataframe

1

У меня есть панда Dataframe, и я хочу найти минимум без нулей и Nans. Я пытался объединить из numpy ненулевого и nanmin, но это не сработает.

У кого-то есть идея?

  • 1
    Можете ли вы добавить образец данных?
  • 1
    Просто сначала отфильтруйте и получите мин
Теги:
pandas
numpy
nan
zero

2 ответа

3
Лучший ответ

Если вы хотите минимум всех df, вы можете попробовать:

m = np.nanmin(df.replace(0, np.nan).values)
1

Используйте numpy.where с numpy.nanmin:

df = pd.DataFrame({'B':[4,0,4,5,5,np.nan],
                   'C':[7,8,9,np.nan,2,3],
                   'D':[1,np.nan,5,7,1,0],
                   'E':[5,3,0,9,2,4]})

print (df)
     B    C    D  E
0  4.0  7.0  1.0  5
1  0.0  8.0  NaN  3
2  4.0  9.0  5.0  0
3  5.0  NaN  7.0  9
4  5.0  2.0  1.0  2
5  NaN  3.0  0.0  4

Решение:

arr = df.values
a = np.nanmin(np.where(arr == 0, np.nan, arr))
print (a)
1.0

Решение Pandas - NaN удаляются по умолчанию:

a = df.mask(df==0).min().min()
print (a)
1.0

Производительность - для каждой строки добавляется одно значение NaN:

np.random.seed(123)
df = pd.DataFrame(np.random.rand(1000,1000))
np.fill_diagonal(df.values, np.nan)
print (df)

#joe answer
In [399]: %timeit np.nanmin(df.replace(0, np.nan).values)
15.3 ms ± 425 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [400]: %%timeit 
     ...: arr = df.values
     ...: a = np.nanmin(np.where(arr == 0, np.nan, arr))
     ...: 
6.41 ms ± 427 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [401]: %%timeit
     ...: df.mask(df==0).min().min()
     ...: 
23.9 ms ± 727 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню