Как устранить ошибку «Невозможно выполнить логическую настройку на месте для смешанных типов со значением, отличным от np.nan» - PullRequest
1 голос
/ 11 мая 2019

Я хочу заполнить np.nan 0 в pd.DataFrame, когда столбцы удовлетворяют определенным условиям.

import pandas as pd
import numpy as np
from datetime import datetime as dt

df = pd.DataFrame({'A': [np.datetime64('NaT'), dt.strptime('201803', '%Y%m'), dt.strptime('201804', '%Y%m'), np.datetime64('NaT'), dt.strptime('201806', '%Y%m')],
                   'B': [1, np.nan, 3, 4, np.nan],
                   'C': [8, 9, np.nan, 4, 1]})

           A   B   C
0        NaT 1.0 8.0
1 2018-03-01 NaN 9.0
2 2018-04-01 3.0 NaN
3        NaT 4.0 4.0
4 2018-06-01 NaN 1.0

Когда df['A'] >= dt.strptime('201804', '%Y%m'), я хочу заполнить np.nan 0 в столбцах B и C. Я хочу получить фрейм данных, как показано ниже.

           A   B   C
0        NaT 1.0 8.0
1 2018-03-01 NaN 9.0
2 2018-04-01 3.0 0.0
3        NaT 4.0 4.0
4 2018-06-01 0.0 1.0 

Я пытался

m = df[df['A'] >= dt.strptime('201804', '%Y%m')][['B', 'C']].isnull()
df.mask(m, 0, inplace=True)

и получил ошибку Cannot do inplace boolean setting on mixed-types with a non np.nan value.Я думаю, что эта ошибка вызвана наличием NaT в столбце A ...

Есть ли другой способ получить желаемый фрейм данных с помощью метода mask?

1 Ответ

0 голосов
/ 11 мая 2019

Я уверен, что есть более элегантное решение, но это работает:

df2 = df.copy()
df2.loc[df2.A>=datetime.strptime('201804', '%Y%m')] = 
df2[df2.A>=datetime.strptime('201804', '%Y%m')].fillna(0)

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

Надеюсь, это полезно,

ура!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...