Julien Marre..
11
很久以前就问过这个问题.那时候,熊猫还没有包括pd.Styler.它已在版本中添加0.17.1.
以下是如何使用它来实现您期望的目标以及更多目标:
中心标题
右对齐任意数字列
左对齐其他列.
为您想要的数字列添加格式化程序
使它成为每列具有相同的宽度.
这是一些示例数据:
In [1]:
df = pd.DataFrame(np.random.rand(10,3)*2000, columns=['A','B','C'])
df['D'] = np.random.randint(0,10000,size=10)
df['TextCol'] = np.random.choice(['a','b','c'], 10)
df.dtypes
Out[1]:
A float64
B float64
C float64
D int64
TextCol object
dtype: object
让我们使用df.style以下格式:
# Construct a mask of which columns are numeric
numeric_col_mask = df.dtypes.apply(lambda d: issubclass(np.dtype(d).type, np.number))
# Dict used to center the table headers
d = dict(selector="th",
props=[('text-align', 'center')])
# Style
df.style.set_properties(subset=df.columns[numeric_col_mask], # right-align the numeric columns and set their width
**{'width':'10em', 'text-align':'right'})\
.set_properties(subset=df.columns[~numeric_col_mask], # left-align the non-numeric columns and set their width
**{'width':'10em', 'text-align':'left'})\
.format(lambda x: '{:,.0f}'.format(x) if x > 1e3 else '{:,.2f}'.format(x), # format the numeric values
subset=pd.IndexSlice[:,df.columns[numeric_col_mask]])\
.set_table_styles([d]) # center the header
请注意.format,您可以很好地设置全局默认值,而不是调用子集列pd.options.display.float_format:
pd.options.display.float_format = lambda x: '{:,.0f}'.format(x) if x > 1e3 else '{:,.2f}'.format(x)
值得一提的是`df.style.set_prop .... render()`返回所需的html,而`df.to_html`则没有. (4认同)