使用熊猫样式循环突出显示每列中的异常值
highlight outlier in each columns using panda style for loop
我想用每列的不同条件最小和最大异常值突出显示我的单元格异常值。这是我的形象
data.
num_cols = ['X','Y','FFMC','DMC','DC','ISI','temp','RH','wind','rain','area']
Q1 = dataset[num_cols].quantile(0.25)
Q3 = dataset[num_cols].quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
我尝试了这个基于此 solustion 的代码:
def highlight_outlier(df_):
styles_df = pd.DataFrame('background-color: white',
index=df_.index,
columns=df_.columns)
for s in num_cols:
styles_df[s].apply(lambda x: 'background-color: yellow' if x < upper[s] or x < lower[s] else 'background-color: white')
return styles_df
dataset_sort = dataset.sort_values("outliers")
dataset_sort.style.apply(highlight_outlier,axis=None)
也尝试了基于此 的代码:
def highlight_outlier(x):
c1 = 'background-color: yellow'
#empty DataFrame of styles
df1 = pd.DataFrame('', index=x.index, columns=x.columns)
#set new columns by condition
for col in num_cols:
df1.loc[(x[col] < upper), col] = c1
df1.loc[(x[col] > lower), col] = c1
return df1
dataset_sort = dataset.sort_values("outliers")
dataset_sort.style.apply(highlight_outlier,axis=None)
都失败了。以及如何在样式化后仅显示 5 个数据?谢谢
在您的计算中 lower
和 upper
属于 pd.Series 类型。因此,您必须在 highlight_outlier()
函数内的循环中使用迭代器以避免索引问题。我在下面使用了upper[i]
。
def highlight_outlier(x):
c1 = 'background-color: yellow'
#empty DataFrame of styles
df1 = pd.DataFrame('', index=x.index, columns=x.columns)
#set new columns by condition
for i, col in enumerate(df.columns):
df1.loc[(x[col] > upper[i]), col] = c1
df1.loc[(x[col] < lower[i]), col] = c1
return df1
最小示例
import pandas as pd
import numpy as np
df = pd.DataFrame({
'a':np.random.randint(0,100,10),
'b':np.random.randint(0,100,10),
})
Q1 = df[['a', 'b']].quantile(0.25)
Q3 = df[['a', 'b']].quantile(0.75)
IQR = Q3 - Q1
# here I set the values to some defaults to see any output
lower = [3, 5] # Q1 - 1.5 * IQR
upper = [97, 95] # Q3 + 1.5 * IQR
df.style.apply(highlight_outlier,axis=None)
我想用每列的不同条件最小和最大异常值突出显示我的单元格异常值。这是我的形象 data.
num_cols = ['X','Y','FFMC','DMC','DC','ISI','temp','RH','wind','rain','area']
Q1 = dataset[num_cols].quantile(0.25)
Q3 = dataset[num_cols].quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
我尝试了这个基于此 solustion 的代码:
def highlight_outlier(df_):
styles_df = pd.DataFrame('background-color: white',
index=df_.index,
columns=df_.columns)
for s in num_cols:
styles_df[s].apply(lambda x: 'background-color: yellow' if x < upper[s] or x < lower[s] else 'background-color: white')
return styles_df
dataset_sort = dataset.sort_values("outliers")
dataset_sort.style.apply(highlight_outlier,axis=None)
也尝试了基于此
def highlight_outlier(x):
c1 = 'background-color: yellow'
#empty DataFrame of styles
df1 = pd.DataFrame('', index=x.index, columns=x.columns)
#set new columns by condition
for col in num_cols:
df1.loc[(x[col] < upper), col] = c1
df1.loc[(x[col] > lower), col] = c1
return df1
dataset_sort = dataset.sort_values("outliers")
dataset_sort.style.apply(highlight_outlier,axis=None)
都失败了。以及如何在样式化后仅显示 5 个数据?谢谢
在您的计算中 lower
和 upper
属于 pd.Series 类型。因此,您必须在 highlight_outlier()
函数内的循环中使用迭代器以避免索引问题。我在下面使用了upper[i]
。
def highlight_outlier(x):
c1 = 'background-color: yellow'
#empty DataFrame of styles
df1 = pd.DataFrame('', index=x.index, columns=x.columns)
#set new columns by condition
for i, col in enumerate(df.columns):
df1.loc[(x[col] > upper[i]), col] = c1
df1.loc[(x[col] < lower[i]), col] = c1
return df1
最小示例
import pandas as pd
import numpy as np
df = pd.DataFrame({
'a':np.random.randint(0,100,10),
'b':np.random.randint(0,100,10),
})
Q1 = df[['a', 'b']].quantile(0.25)
Q3 = df[['a', 'b']].quantile(0.75)
IQR = Q3 - Q1
# here I set the values to some defaults to see any output
lower = [3, 5] # Q1 - 1.5 * IQR
upper = [97, 95] # Q3 + 1.5 * IQR
df.style.apply(highlight_outlier,axis=None)