Nano Hash - криптовалюты, майнинг, программирование

Я пытаюсь заполнить все значения NaN в строках числовыми типами данных до нуля в пандах.

У меня есть DateFrame со смесью строк и строк с плавающей запятой. Все строки с плавающей запятой по-прежнему являются целыми числами и были изменены на числа с плавающей запятой только потому, что в них отсутствовали значения. Я хочу заполнить все строки NaN числами с нулем, оставив NaN в столбцах, которые являются строками. Вот что у меня есть на данный момент.

df.select_dtypes(include=['int', 'float']).fillna(0, inplace=True)

Это не работает, и я думаю, это потому, что .select_dtypes() возвращает представление DataFrame, поэтому .fillna() не работает. Есть ли метод, подобный этому, для заполнения всех NaN только в строках с плавающей запятой.


  • Можете ли вы опубликовать часть вашего фрейма данных или текста, который вы импортировали? 24.03.2017

Ответы:


1

Используйте либо DF.combine_first (не действует inplace):

df.combine_first(df.select_dtypes(include=[np.number]).fillna(0))

или DF.update (изменяет inplace):

df.update(df.select_dtypes(include=[np.number]).fillna(0))

Причина, по которой fillna терпит неудачу, заключается в том, что DF.select_dtypes возвращает совершенно новый фрейм данных, который хотя и образует подмножество исходного DF, но на самом деле не является его частью. Он ведет себя как совершенно новая сущность сама по себе. Таким образом, любые изменения, внесенные в него, не повлияют на DF, из которого он получен.

Обратите внимание, что np.number выбирает все числовые типы.

24.03.2017
  • Спасибо! Я полагал, что ваша теория подмножеств верна, но вы объяснили ее намного лучше. Я просмотрел документацию, но мне все еще немного непонятно, для чего именно используется .update()? 27.03.2017
  • И combine_first, и update функционируют почти одинаково. Единственное отличие состоит в том, что первый изменяет значения для сопоставления индексов из правого DF в левый DF в случае отсутствующих значений в левом DF, тогда как последний изменяет конечные значения из правый DF в левый. См.: pandas.pydata.org/pandas-docs/stable/ для рабочего примера, показывающего их разницу. 27.03.2017
  • Эти примеры действительно помогли. Вы очень помогли. 27.03.2017

  • 2

    Ваш pandas.DataFrame.select_dtypes подход хорош; Вы просто должны пересечь финишную черту:

    >>> df = pd.DataFrame({'A': [np.nan, 'string', 'string', 'more string'], 'B': [np.nan, np.nan, 3, 4], 'C': [4, np.nan, 5, 6]})
    >>> df
                 A    B    C
    0          NaN  NaN  4.0
    1       string  NaN  NaN
    2       string  3.0  5.0
    3  more string  4.0  6.0
    

    Не пытайтесь выполнять здесь fillna на месте (есть время и место для inplace=True, но здесь его нет). Вы правы в том, что select_dtypes возвращает представление. Создайте новый фрейм данных с именем filled и соедините заполненные (или «фиксированные») столбцы с исходными данными:

    >>> filled = df.select_dtypes(include=['int', 'float']).fillna(0)
    >>> filled
         B    C
    0  0.0  4.0
    1  0.0  0.0
    2  3.0  5.0
    3  4.0  6.0
    >>> df = df.join(filled, rsuffix='_filled')
    >>> df
                 A    B    C  B_filled  C_filled
    0          NaN  NaN  4.0       0.0       4.0
    1       string  NaN  NaN       0.0       0.0
    2       string  3.0  5.0       3.0       5.0
    3  more string  4.0  6.0       4.0       6.0
    

    Затем вы можете удалить любые исходные столбцы, которые у вас были, чтобы сохранить только «заполненные»:

    >>> df.drop([x[:x.find('_filled')] for x in df.columns if '_filled' in x], axis=1, inplace=True)
    >>> df
                 A  B_filled  C_filled
    0          NaN       0.0       4.0
    1       string       0.0       0.0
    2       string       3.0       5.0
    3  more string       4.0       6.0
    
    24.03.2017

    3

    Рассмотрим такой кадр данных

        col1    col2    col3    id
    0   1       1       1       a
    1   0       NaN     1       a
    2   NaN     1       1       NaN
    3   1       0       1       b
    

    Вы можете выбрать числовые столбцы и заполнить

    num_cols = df.select_dtypes(include=[np.number]).columns
    df[num_cols]=df.select_dtypes(include=[np.number]).fillna(0)
    
    
        col1    col2    col3    id
    0   1       1       1       a
    1   0       0       1       a
    2   0       1       1       NaN
    3   1       0       1       b
    
    24.03.2017
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..