过滤具有不同dtype单元格的列

时间:2018-06-22 11:52:37

标签: python pandas dataframe styling

我最近问了一个关于对数据帧的特定列应用select_dtypes的问题。

我有一个在其列上具有不同dtypes的数据框(在本例中为str和int)。

df = pd.DataFrame([
[-1, 3, 0],
[5, 2, 1],
[-6, 3, 2],
[7, '<blank>', 3 ],     
['<blank>', 2, 4],
['<blank>', '<blank', '<blank>']], columns='A B C'.split())

我想为字符串和整数创建不同的掩码。然后,我将基于这些蒙版应用样式。

首先让我们定义一个函数,该函数将帮助我为不同的dtypes创建掩码。 (Thanks to @jpp

def filter_type(s, num=True):
    s_new = pd.to_numeric(s, errors='coerce')
    if num:
        return s_new.notnull()
    else:
        return s_new.isnull()

然后我们的第一个遮罩将是:

mask1 = filter_type(df['A'], num=False) # working and creating the bool values

第二个掩码将基于整数间隔:

mask2 = df['A'].between(7 , 0 , inclusive=False)    

但是当我运行mask2时,它给了我错误:

TypeError:'>' not supported between instances of 'str' and 'int'

我该如何克服这个问题?

注意:我要应用的样式如下:

def highlight_col(x):
    df=x.copy
    mask1 = filter_type(df['A'], num=False)
    mask2 = df['A'].between(7 , 0 , inclusive=False)
    x.loc[mask1, ['A', 'B', 'C']] = 'background-color: ""'
    x.loc[mask2, ['A', 'B', 'C']] = 'background-color: #7fbf7f'

1 个答案:

答案 0 :(得分:3)

pd.DataFrame.loc用于设置值。您需要pd.DataFrame.style来设置样式。另外,您可以使用try / except作为识别数字比较失败的方法。

这是一个最小的例子:

def styler(x):
    res = []
    for i in x:
        try:
            if 0 <= i <= 7:
                res.append('background: red')
            else:
                res.append('')
        except TypeError:
            res.append('')
    return res

res = df.style.apply(styler, axis = 1)

结果:

enter image description here