繁体   English   中英

如何解决错误“无法对具有非np.nan值的混合类型执行就地布尔设置”

[英]How to solve the error 'Cannot do inplace boolean setting on mixed-types with a non np.nan value'

我想,以填补np.nan0pd.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') ,我想在B和C列中用0填充np.nan 。我想获得如下数据np.nan

           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 我认为此错误是由于A列中存在NaT而引起的...

是否有另一种方法可以通过使用mask方法来获取所需的数据帧?

我敢肯定,有一个更优雅的解决方案,但这可行:

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

代码的第一行复制原始数据框。 第二行获取满足条件的切片,您可以在其中相应地填充NaN项目。

我希望它是有用的,

干杯!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM