我经常想查看 DataFrame 中
k
行的随机样本,而不仅仅是头/尾,为此我会使用 df.sample(frac=1.0).iloc[:k]
。
当我将
.style
链接到此示例时,样式器将只能看到 k
选定的行,并且生成的颜色映射将不准确,因为它只考虑示例。
如何对 DataFrame 进行洗牌、采样和设计样式,同时确保样式器使用所有数据?
import pandas as pd
import numpy as np
#Data for testing
df = pd.DataFrame({
'device_id': np.random.randint(200, 800, size=1000),
'normalised_score': np.random.uniform(0, 2, size=1000),
'severity_level': np.random.randint(-3, 4, size=1000),
})
#Inaccurate styling if I chain .style onto a sampled DataFrame:
df.sample(frac=1.0).iloc[:5].style.background_gradient(subset='severity_level', cmap='RdYlGn')
我使用的颜色图在
severity_level
(-3、-2、-1、0、+1、+2、+3)范围内大致呈红-白-绿。因此,值 0 应显示为 white,但在下面的示例中它会变成红色:
着色应考虑所有
severity_level
值,即使我只显示一些随机选择的行。
您需要首先将
df
插入样式器,然后链接到 .hide
,然后使用 .hide(df.sample(frac=1.0).index[:k])
选择行的随机子集。
.hide
不采用 lambda
函数,因此您无法在 .style
之前进行洗牌,然后在链中稍后访问洗牌后的 DataFrame。
#... data from OP
(
df
.style
.background_gradient(subset='severity_level', cmap='RdYlGn')
#Select k indices after shuffling
.hide(df.sample(frac=1.0).index[:-5])
)
因此,值 0 应显示为白色,但它会变成红色,因为样式器仅获取部分数据
样式器现在使用
severity_level
的所有值,无论显示的示例如何