Python 如何有选择地将样式应用于特定列的行?

Python 如何有选择地将样式应用于特定列的行?,python,pandas,Python,Pandas,我想标记所需列(所需D到L)中的异常。这里,异常定义为每行中的任何值400000 有关数据集,请参见下文 import pandas as pd # intialise data of lists data = { 'A':['L1', 'L2', 'L3', 'L4', 'L5'], 'B':[1,1,1,1,1], 'C':[1,2,3,5,9], 'desired_D':[12005, 18190, 1021,

我想标记
所需列
(所需D到L)中的异常。这里,异常定义为每行中的任何值
400000

有关数据集,请参见下文

import pandas as pd
  
# intialise data of lists
data = { 
         'A':['L1', 'L2', 'L3', 'L4', 'L5'],
         'B':[1,1,1,1,1],
         'C':[1,2,3,5,9],
         'desired_D':[12005, 18190, 1021, 13301, 31119],
        'desired_E':[11021, 19112, 19021, 15, 24509 ],
        'desired_F':[10022,19910, 19113,449999, 25519],
        'desired_G':[14029, 29100, 39022, 24509, 412271],
        'desired_H':[52119,32991,52883,69359,57835],
         'desired_J':[41218, 52991,55121,69152,79355],
         'desired_K': [43211,7672991,56881,211,77342],
          'desired_L': [31211,42901,53818,62158,69325],
        }
  
# Create DataFrame
df = pd.DataFrame(data)
  
# Print the output.
df

目前,我的代码包含
B
列和
C
列(我想排除它们)

修订后的代码如下所示:

# function to flag the anomaly in each row- this flags columns B and C as well (I want to exclude these columns)

dont_format_cols = ['B','C']

def flag_outliers(s, dont_format_cols):
    if s.name in dont_format_cols:
        return '' # or None, or whatever df.style() needs
    else:
        s = pd.to_numeric(s, errors='coerce')
        indexes = (s<1500)|(s>400000)
        return ['background-color: red' if v else '' for v in indexes]

styled = df.style.apply(flag_outliers, axis=1)
styled
#函数标记每行中的异常-这也标记B列和C列(我想排除这些列)
dont_format_cols=['B','C']
def flag_异常值(s、NOT_format_COL):
如果s.name采用dont\u格式\u cols:
返回“”#或None,或df.style()需要的任何内容
其他:
s=pd.to_numeric(s,errors='concurve')
索引=(s400000)
返回['background-color:red'if v else''表示索引中的v]
styled=df.style.apply(标记异常值,轴=1)
风格
编辑后的错误

所需输出:应排除
B
C
,请参阅下图

将离群值样式化功能(按列)应用于df的所有列。如果只想将其应用于某些列,请使用
子集
参数。


编辑:我不知道
df.style.apply()
有一个
子集
参数,我已经提出了以下黑客方法:

1:检查样式功能内的序列名称
s.name
,就像解决方案一样

2:另一种黑客方法:在函数中添加第二个参数
dont\u format\u cols
标记异常值(s,dont\u format\u cols)。现在,您必须在apply调用中传递它,因此需要一个lambda:

styled = df.style.apply(lambda s: flag_outliers(s, dont_format_cols), axis=1)
以及:


使用
子集
参数。这正是它将样式仅隔离到特定区域的目的

i、 e
df.style.apply(标记异常值,轴=1,子集=)


您可以在pandas Styler用户指南文档中看到名为“精细切片”的示例。

将异常值样式功能(按列)应用于所有df。如果只想将其应用于某些列,请检查样式设置函数中的序列名称
s.name
,如中所示,这是否回答了您的问题?请准确地陈述你的问题。“如何标记异常…”是一条红鲱鱼(你实际上不是在寻找异常检测启发式),你试图有选择地应用样式。遗憾的是,这对我不起作用,我想我没有得到什么。我使用了你的代码(请参考我修改过的代码),得到一个错误
TypeError:flag\u outliers()缺少一个必需的位置参数:“dont\u format\u cols”
@RickyTricky:它确实有效。显然,因为我们添加了第二个arg
dont\u format\u cols
,所以您要么传递它,要么默认它。或者作为。快速破解,您可以将其硬连接到
flag\u outliers()
的主体中,而无需添加额外的参数
dont\u format\u cols
修改答案以显示这一点。请阅读pandas
apply()
并查看一些示例,说明我们何时声明lambda函数以传入丢失/额外参数。在将
axis=1
更改为
axis=0
后,现在可以工作了。Thanks@Attack68当前位置我没有“忽略”它,我意识到它的存在。我更新了答案中的链接
styled = df.style.apply(lambda s: flag_outliers(s, dont_format_cols), axis=1)
def flag_outliers(s, dont_format_cols):
    if s.name in dont_format_cols:
        return '' # or None, or whatever df.style() needs
    else:
        # code to apply formatting