gpt4 book ai didi

python - pandas 多索引列样式器

转载 作者:行者123 更新时间:2023-12-01 06:27:08 24 4
gpt4 key购买 nike

版本:Python 3.7.6pandas 1.0.0

输入数据框

df = pd.DataFrame(dict(
recruit_dt=["1/1/2017"]*3+["1/1/2018"]*3+["1/1/2019"]*3,
label = [1,3,4]*3,
nmem = np.random.choice(list(range(10000,3000000)),9),
pct_fem = np.random.sample(9),
mean_age = 50 + 10*np.random.sample(9),
sd_age = 8 + 2*np.random.sample(9)
))

希望在经过以下转换后呈现此内容

dfp = pd.pivot_table(df, values=["nmem","pct_fem","mean_age","sd_age"], index="recruit_dt", columns="label")
dfp = dfp.reindex(columns=['nmem', 'pct_fem', 'mean_age', 'sd_age'], level=0)

如何编写样式器,以便所有 nmem 列都有千位分隔符 {:,},“pct_fem”是保留两位小数的百分比, mean_agesd_age 是带有两位小数的 float 吗?是否有一种方法将 styler.formatstyler.applyIndexSlice 结合使用?

==编辑:这似乎有效。有没有更简洁的解决方案?

dfp.columns.names = ["metrics","label"]
dfp.style.format("{:,}", subset=pd.IndexSlice[:,'nmem']) \
.format("{:.2%}", subset=pd.IndexSlice[:,'pct_fem']) \
.format("{:.2f}", subset=pd.IndexSlice[:,['mean_age','sd_age']])

最佳答案

您可以使用列表理解为 subset 参数指定一个参数,以选择相关列。

>>> (dfp
.style
.format('{:.0f}', na_rep='-', subset=[col for col in dfp.columns if col[0] == 'nmen'])
.format('{:.2%}', na_rep='-', subset=[col for col in dfp.columns if col[0] == 'pct_fem'])
.format('{:,.2f}', na_rep='-', subset=[col for col in dfp.columns if col[0] in {'mean_age', 'sd_age'}])
)

enter image description here

更通用的解决方案:

# Styles.
pct_two = '{:.2%}'
comma_float = '{:.0f}'
comma_float_2 = '{:.2f}'

# Styling to be applied to specified columns.
formats = {
'nmean': comma_float,
'pct_fem': pct_two,
'mean_age': comma_float_2,
'sd_age': comma_float_2,
}

# Create dictionary of multi-index columns with specified styling.
format_dict = {
midx: formats[level_val]
for level_val in formats
for midx in [col for col in dfp if col[0] == level_val]
}

# Apply styling to dataframe.
dfp.style.format(format_dict)

关于python - pandas 多索引列样式器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60080998/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com