Pandas 2.2.1中fillna填充布尔值触发警告,如何规范处理?
解决Pandas 2.2.1中fillna的FutureWarning问题
针对你遇到的警告,有几种符合新版Pandas规范的调整方式,推荐优先使用更简洁高效的方案:
方案1:直接用isin生成标记列(最推荐)
跳过合并后填充NaN的步骤,直接通过isin判断主数据的name是否在排除项列表中,直接生成布尔类型的excluded列,完全避免类型转换问题:
import pandas as pd MainData = {'name': ['apple', 'pear', 'orange', 'watermelon'], 'other': ['blah' , 'blah', 'blah' , 'blah']} dfMainData = pd.DataFrame(MainData) Exclusions = {'name': ['pear' , 'watermelon'], 'reason': ['pears suck', 'too messy!']} dfExclusions = pd.DataFrame(Exclusions) # 直接生成excluded布尔列 dfMainData['excluded'] = dfMainData['name'].isin(dfExclusions['name']) # 如需保留reason列,单独合并该列 dfMainData = dfMainData.merge(dfExclusions[['name', 'reason']], how='left', on='name')
方案2:按照警告提示使用infer_objects
如果坚持原有合并逻辑,在fillna后调用infer_objects(copy=False)显式转换类型,消除警告:
import pandas as pd MainData = {'name': ['apple', 'pear', 'orange', 'watermelon'], 'other': ['blah' , 'blah', 'blah' , 'blah']} dfMainData = pd.DataFrame(MainData) Exclusions = {'name': ['pear' , 'watermelon'], 'reason': ['pears suck', 'too messy!']} dfExclusions = pd.DataFrame(Exclusions) dfExclusions['excluded'] = True dfMainData = pd.merge(dfMainData, dfExclusions, how='left', on='name') # 显式转换类型,替代隐式向下转换 dfMainData['excluded'] = dfMainData['excluded'].fillna(False).infer_objects(copy=False)
方案3:提前指定数据类型
在创建excluded列时就指定布尔类型,合并后填充False时避免类型歧义:
import pandas as pd MainData = {'name': ['apple', 'pear', 'orange', 'watermelon'], 'other': ['blah' , 'blah', 'blah' , 'blah']} dfMainData = pd.DataFrame(MainData) Exclusions = {'name': ['pear' , 'watermelon'], 'reason': ['pears suck', 'too messy!']} dfExclusions = pd.DataFrame(Exclusions) # 显式指定excluded为布尔类型 dfExclusions['excluded'] = pd.Series([True]*len(dfExclusions), dtype='bool') dfMainData = pd.merge(dfMainData, dfExclusions, how='left', on='name') # 填充False,此时列类型为boolean,不会触发警告 dfMainData['excluded'] = dfMainData['excluded'].fillna(False)
说明
方案1不仅消除了警告,还简化了逻辑,执行效率更高;方案2和3则是在原有逻辑基础上调整,适配新版Pandas的类型转换规则。
内容的提问来源于stack exchange,提问作者user3246693
相关产品推荐
相关产品推荐

