You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何解决Pandas中Setting an item of incompatible dtype的FutureWarning问题

如何解决Pandas中Setting an item of incompatible dtype的FutureWarning问题

嘿,我完全懂你遇到的这个困扰!这个FutureWarning其实是Pandas在提醒你:你正在把带ANSI颜色编码的字符串赋值给原本是数值类型(比如int64)的Series,两者数据类型不兼容,而这种隐式类型转换在未来的Pandas版本里会直接报错,不再只是警告。

直接用warnings.simplefilter忽略警告虽然能暂时解决眼前的提示,但并不是从根源上处理问题的方式。咱们可以通过显式转换数据类型来彻底消除这个警告,具体做法如下:

问题根源拆解

你的格式化函数(比如norm_formatterspcl_formatter)返回的是带颜色的字符串(比如\x1b[97m0\x1b[0m这种带转义码的内容),但原DataFrame的列是整数类型。当你直接把字符串赋值给整数类型的Series时,Pandas就会抛出类型不兼容的警告。

具体解决方案

核心思路是:在对Series进行颜色格式化之前,先把它转换成字符串类型,这样后续赋值带颜色的字符串就不会有类型冲突了。下面是修改后的完整代码:

from termcolor import colored
import pandas as pd
import numpy as np

data = {'Col1': [0, 15, 10, 5, 20, 17, 20], 'Col2': [11, 6, -3, 16, 21, 8, 26], 'STKS': [20, 30, 40, 50, 60, 70, 80], 'Col4': [3, 8, -13, -18, 3, 23, 42], 'Col5': [4, 19, 8, 11, 6, 20, 32]}

df = pd.DataFrame(data)

ATM = 50

def hightlight(series, excluded, spcl_col, spcl_val, extra_col= [] ):

    def excl_formatter(series):
        # 直接把数值转成字符串后再上色
        return [colored(str(x), 'white') for x in series]

    def norm_formatter(series, extra=False):
        # 关键:先把Series转换成字符串类型,避免类型不兼容
        tmp = series.astype(str).sort_values()
        if extra:
            # 因为现在是字符串,需要转成float判断符号
            tmp.iloc[:-2] = tmp.iloc[:-2].map(lambda x: colored(x, *[('white' ,), ('green' ,),('light_red' ,),][np.sign(float(x))]))
        else:
            tmp.iloc[:-2] = tmp.iloc[:-2].map(lambda x: colored(x, 'white'))
        tmp.iloc[-2] = colored(tmp.iloc[-2], None, 'on_magenta')
        tmp.iloc[-1] = colored(tmp.iloc[-1], None, 'on_blue')
        return tmp

    def spcl_formatter(series):
        # 先转成字符串,再判断值(转成int对比)
        series_str = series.astype(str)
        return [colored(x, None, 'on_blue') if int(x) == spcl_val else colored(x, None,  'on_red') for x in series_str]

    if series.name == spcl_col:
        return spcl_formatter(series)
    if series.name in excluded:
        return excl_formatter(series)
    return norm_formatter(series, extra=series.name in extra_col)

col_to_exclude = ['STKS']

df_f1 = df.apply(hightlight, excluded=col_to_exclude, spcl_col='STKS',spcl_val=ATM, extra_col=['Col2', 'Col4']).rename(columns=lambda x: colored(x, 'white', None))

print(df_f1.to_string(index= False))

修改要点说明

  1. norm_formatter中,用series.astype(str)把原本的数值Series转换成字符串类型,再进行排序和上色操作
  2. spcl_formatter中,先把Series转成字符串,判断值的时候再转回int和spcl_val对比
  3. 这样处理后,整个Series的类型会变成object(字符串集合),这完全符合我们的需求——因为最终目的是打印带颜色的文本,而非进行数值计算

这种方式不仅能彻底消除FutureWarning,还能让代码更符合Pandas未来版本的规范,比单纯忽略警告要靠谱得多!

备注:内容来源于stack exchange,提问作者Dr Brijesh K. Chaurasia

火山引擎 最新活动