Установка глобальных значений по умолчанию для skipna в False - PullRequest
2 голосов
/ 27 апреля 2019

Для некоторых функций Pandas, таких как sum (), cumsum () и cumprod (), есть опция для skipna, которая по умолчанию установлена ​​в True.Это вызывает у меня проблемы, так как ошибки могут молча распространяться, поэтому я всегда явно устанавливаю для skipna значение False.

sum_df = df.sum(skipna=False)

Выполнение этого каждый раз, когда появляется одна из этих функций, делает код несколько громоздким.Есть ли способ изменить поведение по умолчанию в Pandas?

Ответы [ 2 ]

1 голос
/ 16 мая 2019

Опция не является опцией (пока)

Кажется, что нет такой опции для управления этим поведением. Это жестко закодировано:

import inspect
inspect.getfile(pd.DataFrame.sum)    # './pandas/core/generic.py'
inspect.getsource(pd.DataFrame.sum)

# @Substitution(outname=name, desc=desc, name1=name1, name2=name2,
#                  axis_descr=axis_descr, min_count=_min_count_stub,
#                  see_also=see_also, examples=examples)
# @Appender(_num_doc)
# def stat_func(self, axis=None, skipna=None, level=None, numeric_only=None,
# [...]

Это может быть хорошей идеей для запроса извлечения.

Простое решение

Возможно, не лучшее решение, оно немного хакерское, но оно решает вашу проблему.

Я не говорю, что это хорошая практика в целом. У него могут быть недостатки, которые я не учел (вы можете указать это в комментарии). В любом случае, это решение имеет преимущество: не навязчиво .

Кроме того, несмотря на то, что это довольно простая техника и это чистый PSL, она может нарушать Принцип Наименьшего Удивления (подробности см. В этом ответе ).

MCVE

Позволяет создать оболочку, которая переопределяет существующие параметры по умолчанию или добавляет дополнительные параметры:

def set_default(func, **default):
    def inner(*args, **kwargs):
        kwargs.update(default)        # Update function kwargs w/ decorator defaults
        return func(*args, **kwargs)  # Call function w/ updated kwargs
    return inner                      # Return decorated function

Тогда мы можем украсить любую функцию. Например:

import pandas as pd
pd.DataFrame.sum = set_default(pd.DataFrame.sum, skipna=False)

Затем метод sum объекта DataFrame имеет skipna, переопределенный на False каждый раз, когда мы его вызываем. Теперь следующий код:

import numpy as np
df = pd.DataFrame([1., 2., np.nan])
df.sum()

Возвращает:

0   NaN
dtype: float64

Вместо:

0    3.0
dtype: float64

Автоматизация

Мы можем применить эту модификацию сразу ко многим функциям:

for key in ['sum', 'mean', 'std']:
    setattr(pd.DataFrame, key, set_default(getattr(pd.DataFrame, key), skipna=False))

Если мы сохраним эти изменения в модуле python (файл .py), они будут применены во время импорта без необходимости изменять сам код Pandas.

0 голосов
/ 27 апреля 2019

Возможно, это не лучший способ, но я думаю, вам следует изменить файл панд .

1.Найдите файл панд.

Если вы установили панд с помощью pip, он должен находиться в файле Lib, который находится в папке установки вашего python.Если вы не знаете, где установлен python, найдите его в Google.

Если вы не установили его с помощью pip, посмотрите в Google, где находятся пакеты, установленные с вашим программным обеспечением (anaconda или другим)

2.Найдите класс DataFrame и метод.

Лучший способ сделать это - нажать CTRL + F или другую букву для поиска метода

3.Измените значение по умолчанию.

Когда вы нашли метод (ы), измените skipna=True на skipna=False.

После того, как вы это сделаете, сохраните файл и егодолжно работать!

Надеюсь, я вам помог:)

...