0%

【Python】pandas dataframe输出格式对齐美化的思路

需求

在jupyter中可以直接使用用dataframe的名字输出美观的表格形式,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import QUANTAXIS as QA

"""
通过本地数据库获取股票日线数据:
QA.QA_fetch_stock_day_adv(
code,
start='all',
end=None,
if_drop_index=True,
collections=Collection(Database(MongoClient(host=['localhost:27017'], document_class=dict, tz_aware=False, connect=True), 'quantaxis'), 'stock_day'),
)
"""

data=QA.QA_fetch_stock_day_adv(["002003",'300999','603899'],'2021-05-12','2021-05-13')
df = data.data
df
open high low close volume amount
date code
2021-05-12 002003 7.32 7.51 7.28 7.48 80536.0 5.980900e+07
300999 76.12 76.75 75.11 76.20 146625.0 1.114936e+09
603899 86.80 87.85 85.71 86.60 19172.0 1.656046e+08
2021-05-13 002003 7.44 7.63 7.34 7.55 98429.0 7.403393e+07
300999 75.00 75.60 74.04 74.20 144742.0 1.080974e+09
603899 85.71 88.12 85.10 87.59 14734.0 1.280291e+08

在使用print输出时的结果是这样的。

1
print(df)
                    open   high    low  close    volume        amount
date       code                                                      
2021-05-12 002003   7.32   7.51   7.28   7.48   80536.0  5.980900e+07
           300999  76.12  76.75  75.11  76.20  146625.0  1.114936e+09
           603899  86.80  87.85  85.71  86.60   19172.0  1.656046e+08
2021-05-13 002003   7.44   7.63   7.34   7.55   98429.0  7.403393e+07
           300999  75.00  75.60  74.04  74.20  144742.0  1.080974e+09
           603899  85.71  88.12  85.10  87.59   14734.0  1.280291e+08

而当DataFrame中存在中英文混合的时候,会出现print()打印无法对齐的情况,导致输出的结果都没有对齐,十分不美观。如:

1
2
3
df1 = df
df1.columns = ["开盘价", "最高价", "最低价", "收盘价", "成交量", "成交金额"]
print(df1)
                     开盘价    最高价    最低价    收盘价       成交量          成交金额
date       code                                                      
2021-05-12 002003   7.32   7.51   7.28   7.48   80536.0  5.980900e+07
           300999  76.12  76.75  75.11  76.20  146625.0  1.114936e+09
           603899  86.80  87.85  85.71  86.60   19172.0  1.656046e+08
2021-05-13 002003   7.44   7.63   7.34   7.55   98429.0  7.403393e+07
           300999  75.00  75.60  74.04  74.20  144742.0  1.080974e+09
           603899  85.71  88.12  85.10  87.59   14734.0  1.280291e+08

那么问题来了。 1. 有没有办法使用print输出中英文混合的dataframe可以对齐美观? 2. 在执行完整的python代码时(非jupyter),有办法象jupyter中一样输出美观的dataframe表格么?

解决办法

问题1 有没有办法使用print输出中英文混合的dataframe可以对齐美观?

1
2
3
4
5
import pandas as pd
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
pd.set_option('display.width', 180) # 设置打印宽度(**重要**)
print(df1)
                   开盘价  最高价  最低价  收盘价    成交量      成交金额
date       code                                                          
2021-05-12 002003    7.32    7.51    7.28    7.48   80536.0  5.980900e+07
           300999   76.12   76.75   75.11   76.20  146625.0  1.114936e+09
           603899   86.80   87.85   85.71   86.60   19172.0  1.656046e+08
2021-05-13 002003    7.44    7.63    7.34    7.55   98429.0  7.403393e+07
           300999   75.00   75.60   74.04   74.20  144742.0  1.080974e+09
           603899   85.71   88.12   85.10   87.59   14734.0  1.280291e+08

问题2 在执行完整的python代码时(非jupyter),有办法象jupyter中一样输出美观的dataframe表格么?

使用IPython.display来替换print的输出效果。

1
2
3
4
from IPython.display import display

display(df)
display(df1)
开盘价 最高价 最低价 收盘价 成交量 成交金额
date code
2021-05-12 002003 7.32 7.51 7.28 7.48 80536.0 5.980900e+07
300999 76.12 76.75 75.11 76.20 146625.0 1.114936e+09
603899 86.80 87.85 85.71 86.60 19172.0 1.656046e+08
2021-05-13 002003 7.44 7.63 7.34 7.55 98429.0 7.403393e+07
300999 75.00 75.60 74.04 74.20 144742.0 1.080974e+09
603899 85.71 88.12 85.10 87.59 14734.0 1.280291e+08
开盘价 最高价 最低价 收盘价 成交量 成交金额
date code
2021-05-12 002003 7.32 7.51 7.28 7.48 80536.0 5.980900e+07
300999 76.12 76.75 75.11 76.20 146625.0 1.114936e+09
603899 86.80 87.85 85.71 86.60 19172.0 1.656046e+08
2021-05-13 002003 7.44 7.63 7.34 7.55 98429.0 7.403393e+07
300999 75.00 75.60 74.04 74.20 144742.0 1.080974e+09
603899 85.71 88.12 85.10 87.59 14734.0 1.280291e+08

问题3 输出dataframe数据时,可以不输出索引号么?

python 2.7

1
print df.to_string(index=False)

python 3

1
print(df.to_string(index=False))