Pandas Style 为数据表格美颜

论坛 期权论坛     
选择匿名的用户   2021-5-23 01:16   44   0
<div id="js_content">
<p style="text-align: center"><a href="http://mp.weixin.qq.com/s?__biz&#61;MzI2NjY5NzI0NA%3D%3D&amp;chksm&#61;ea8b61bcddfce8aaad6bd2a2aee3f66e1bc5ea03dc76b24d8223f84a8fd7b24d0ee7f7622e82&amp;idx&#61;2&amp;mid&#61;2247487183&amp;scene&#61;21&amp;sn&#61;eeddaad7d89459a9ed3a91fde25ee3be#wechat_redirect"><img src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-95993070c19674f7cdaf6b30e43177f5"></a></p>
<p>作者:牵引小哥</p>
<p>来源:牵引小哥讲Python</p>
<p style="text-align: center"><img src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-8392a8f32eaf7f756b19fc7dc83ad4cc"></p>
<h2>1. 创建样式</h2>
<p>传递样式函数的方法:</p>
<ul><li><p><code>Styler.applymap</code>: 逐个元素,返回带有CSS属性-值对的单个字符串。</p></li><li><p><code>Styler.apply</code>: 列/行/表方式,返回形状相同的Series或DataFrame,其中每个值都是带有CSS属性值对的字符串。</p></li></ul>
<p><code>Styler.applymap</code> 作用于DataFrame中的每一个元素。<code>Styler.apply</code> 通过<code>axis</code>参数,每一次将一列或一行或整个表传递到DataFrame中。对于按列使用 <code>axis&#61;0</code>, 按行使用 <code>axis&#61;1</code>, 整个表使用 <code>axis&#61;None</code>.</p>
<pre class="blockcode"><code class="language-go">import pandas as pd
import numpy as np

np.random.seed(24)
df &#61; pd.DataFrame({&#39;A&#39;: np.linspace(1, 10, 10)})
df &#61; pd.concat([df, pd.DataFrame(np.random.randn(10, 4), columns&#61;list(&#39;BCDE&#39;))],
               axis&#61;1)
df.iloc[3, 3] &#61; np.nan
df.iloc[0, 2] &#61; np.nan
</code></pre>
<pre class="blockcode"><code class="language-go"># 默认无样式
df.style
</code></pre>
<img src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-422ae4a965de1d7496e385ef4c229f22">
<p><strong>「注意」</strong>: <code>DataFrame.style</code> 返回Styler对象的属性。</p>
<pre class="blockcode"><code class="language-go"># 通过调用.render方法来查看它们
df.style.highlight_null().render().split(&#39;\n&#39;)[:10]
</code></pre>
<pre class="blockcode"><code class="language-go">[&#39;&lt;style  type&#61;&#34;text/css&#34; &gt;&#39;,
&#39;    #T_98ef3b58_b54d_11ea_87c2_8056f2b2fdccrow0_col2 {&#39;,
&#39;            background-color:  red;&#39;,
&#39;        }    #T_98ef3b58_b54d_11ea_87c2_8056f2b2fdccrow3_col3 {&#39;,
&#39;            background-color:  red;&#39;,
&#39;        }&lt;/style&gt;&lt;table id&#61;&#34;T_98ef3b58_b54d_11ea_87c2_8056f2b2fdcc&#34; &gt;&lt;thead&gt;    &lt;tr&gt;        &lt;th class&#61;&#34;blank level0&#34; &gt;&lt;/th&gt;        &lt;th class&#61;&#34;col_heading level0 col0&#34; &gt;A&lt;/th&gt;        &lt;th class&#61;&#34;col_heading level0 col1&#34; &gt;B&lt;/th&gt;        &lt;th class&#61;&#34;col_heading level0 col2&#34; &gt;C&lt;/th&gt;        &lt;th class&#61;&#34;col_heading level0 col3&#34; &gt;D&lt;/th&gt;        &lt;th class&#61;&#34;col_heading level0 col4&#34; &gt;E&lt;/th&gt;    &lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&#39;,
&#39;                &lt;tr&gt;&#39;,
&#39;                        &lt;th id&#61;&#34;T_98ef3b58_b54d_11ea_87c2_8056f2b2fdcclevel0_row0&#34; class&#61;&#34;row_heading level0 row0&#34; &gt;0&lt;/th&gt;&#39;,
&#39;                        &lt;td id&#61;&#34;T_98ef3b58_b54d_11ea_87c2_8056f2b2fdccrow0_col0&#34; class&#61;&#34;data row0 col0&#34; &gt;1.000000&lt;/td&gt;&#39;,
&#39;                        &lt;td id&#61;&#34;T_98ef3b58_b54d_11ea_87c2_8056f2b2fdccrow0_col1&#34; class&#61;&#34;data row0 col1&#34; &gt;1.329212&lt;/td&gt;&#39;]
</code></pre>
<h3>编写一个简单的样式函数,该函数会将负数涂成红色,将正数涂成黑色。</h3>
<pre class="blockcode"><code class="language-go">def color_negative_red(val):
    &#34;&#34;&#34;
    Takes a scalar and returns a string with
    the css property &#96;&#39;color: red&#39;&#96; for negative
    strings, black otherwise.
    &#34;&#34;&#34;
    color &#61; &#39;red&#39; if val &lt; 0 else &#39;black&#39;
    return &#39;color: %s&#39; % color
</code></pre>
<p>在这种情况下,单元格的样式仅取决于其自身的值。我们应该使用在 <code>Styler.applymap</code>作用于每个元素。</p>
<pre class="blockcode"><code class="language-go">df.style.applymap(color_negative_red)
</code></pre>
<img src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-b985f785c44ba67f900fa192cbbc750c">
<h3>定义一个突出显示每列中的最大值的函数。</h3>
<pre class="blockcode"><code class="language-go">def highlight_max(s):
    &#39;&#39;&#39;
    highlight the maximum in a Series yellow.
    &#39;&#39;&#39;
    is_max &#61; s &#61;&#61; s.max()
    return [&#39;background-color: yellow&#39; if v else &#39;&#39; for v in is_max]
</code></pre>
<pre class="blockcode"><code class="language-go">df.style.apply(highlight_max)
</code></pre>
<img src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-8160f9752943cb9a03dd2f365d0707a6">
<h4>实际上,已有定义好的各类高亮函数:</h4>
<p>配合<code>axis</code>参数使用</p>
<ul><li><p>highlight_max():高亮最大值</p></li><li><p>highlight_min():高亮最小值</p></li><li><p>highlight_null():高亮空值</p></li></ul>
<pre class="blockcode"><code class="language-go"># 高亮行最大值
df.style.highlight_max(axis&#61;1)
</c
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP