Pandas Styler转置DataFrame后样式失效的解决方法求助
Pandas Styler转置DataFrame后样式失效的解决方法求助
我太懂你的困扰了——想把带垂直条形的表格改成水平显示,结果转置后样式直接消失,还多出一堆不想看到的列名,试了各种参数要么报错要么没效果,确实让人头大!
先给你捋清楚问题根源:当你用df.T转置后,原来的列(word和weight)变成了行索引,而原来的行索引(0-8)反而成了新的列名。这时候你用subset=['weight']去找列,自然会报KeyError,因为weight现在是行索引,根本不是列名!
下面给你两个实用的解决方案,你可以按需选:
方案一:调整转置结构,适配样式规则
这个方法先把转置后的表格结构理顺,让word成为列名,再给weight行添加水平条形:
import numpy as np import pandas as pd from IPython.display import HTML, display # 注意:别用input当变量名,会覆盖Python内置函数 input_text = "Please go to the store and get some milk" words = input_text.split() weights = [0.4,.9,0.15,0.0,.8,0.05,.93,0.05,.98] df = pd.DataFrame({"word":words, "weight":weights}) # 转置后重新设置列名为word值,只保留weight行 df_transposed = df.T df_transposed.columns = df_transposed.loc['word'] # 把word行转成列名 df_transposed = df_transposed.drop('word') # 移除word行,只留数值行 # 给weight行的所有列添加水平条形,axis=1表示按行计算条形比例 styled_table = df_transposed.style.format(precision=3).bar(axis=1, vmin=0, vmax=1) # 隐藏行索引(也就是'weight'这个标签,不需要显示) styled_table = styled_table.hide(axis='index') display(HTML(styled_table.to_html()))
这样出来的效果就是:顶部是各个word,下方对应每个word的水平条形,完全符合你要的「第一个版本转成水平」的需求。
方案二:直接指定行作为subset(更简洁)
如果你不想修改原DataFrame结构,也可以直接针对转置后的weight行来设置样式,同时隐藏顶部的默认列名:
import numpy as np import pandas as pd from IPython.display import HTML, display input_text = "Please go to the store and get some milk" words = input_text.split() weights = [0.4,.9,0.15,0.0,.8,0.05,.93,0.05,.98] df = pd.DataFrame({"word":words, "weight":weights}) # 转置后,指定subset为('weight', slice(None)),表示选中weight行的所有列 styled_table = df.T.style.format(precision=3).bar( subset=('weight', slice(None)), # 精准选中weight行的全部列 axis=1, vmin=0, vmax=1 ).hide(axis='columns') # 隐藏顶部的默认数字列名(0-8那些) display(HTML(styled_table.to_html()))
这里的slice(None)表示选中所有列,配合行索引'weight'就能精准定位到要加样式的单元格,再用hide(axis='columns')去掉多余的数字列名,效果和方案一一致。
关键要点总结:
- 转置后行列角色互换,一定要注意
subset的定位逻辑(行索引+列,而非原来的列名) bar方法的axis=1表示按行计算条形长度,这样才能生成水平方向的条形- 用
hide(axis='columns')或hide(axis='index')可以去掉不需要的标签
备注:内容来源于stack exchange,提问作者sh37211
相关产品推荐
相关产品推荐

