如何对齐含阿拉伯语、泰语等Unicode字符的DataFrame列显示?
如何对齐含阿拉伯语、泰语等非CJK Unicode字符的DataFrame列
我有一个包含阿拉伯语、泰语等外文Unicode字符的DataFrame,在终端执行print(df)时列显示不对齐。已尝试设置pd.set_option("display.unicode.east_asian_width", True),但仅能对齐含CJK(中日韩)字符的行,阿拉伯语和泰语行仍未对齐。请问如何在执行print(df)时正确对齐包含这类易导致错位的Unicode字符的DataFrame列?
示例代码
import pandas as pd unicode_chars_list = ['我是一個蘋果', '麺作りは美味しいです', '나는 공원에서 걷고 뛰는 것을 좋아합니다', 'اكل البيتزا لذيذ جدا اريد المزيد.', 'มีจระเข้อยู่ในแม่น้ำ โปรดระวัง', 'Ευχαριστώ τους προγόνους μας.', 'Normal English sentence'] data = { 'a':[2134,4,547,56,3,234,124], 'language': ['Chinese', 'Japanese', 'Korean', 'Arabic', 'Thai', 'Greek', 'English'], 'unicode_chars': unicode_chars_list, 'b': [1,2,3,4,5,6,7], 'c': ['I am a long string here', '2nd string I want this to be some length', '3rd string please', '4th', '5th very loooooong',' 6 be good to the dataframe', '7 the end'] } df = pd.DataFrame(data)
现象说明
- 不含外文Unicode字符的子DataFrame显示正常对齐:
print(df.loc[:,['a','language','b','c']]) # a language b c # 0 2134 Chinese 1 I am a long string here # 1 4 Japanese 2 2nd string I want this to be some length # 2 547 Korean 3 3rd string please # 3 56 Arabic 4 4th # 4 3 Thai 5 5th very loooooong # 5 234 Greek 6 6 be good to the dataframe # 6 124 English 7 7 the end
- 包含全量Unicode字符的DataFrame显示错位:
print(df) # a language unicode_chars b c # 0 2134 Chinese 我是一個蘋果 1 I am a long string here # 1 4 Japanese 麺作りは美味しいです 2 2nd string I want this to be some length # 2 547 Korean 나는 공원에서 걷고 뛰는 것을 좋아합니다 3 3rd string please # 3 56 Arabic اكل البيتزا لذيذ جدا اريد المزيد. 4 4th # 4 3 Thai มีจระเข้อยู่ในแม่น้ำ โปรดระวัง 5 5th very loooooong # 5 234 Greek Ευχαριστώ τους προγόνους μας. 6 6 be good to the dataframe # 6 124 English Normal English sentence 7 7 the end
- 设置
pd.set_option("display.unicode.east_asian_width", True)后,仅CJK行对齐,阿拉伯语、泰语行仍错位。
环境:macOS Ventura 13.2,Python 3.11.2
解决方案
方案1:用wcwidth库自定义格式化函数
Pandas默认仅处理CJK字符的宽度计算,对阿拉伯语、泰语等字符的显示宽度判断不准。wcwidth库可以精准计算每个字符串的终端显示宽度,据此手动格式化输出:
- 安装依赖:
pip install wcwidth
- 自定义格式化函数:
import pandas as pd from wcwidth import wcswidth def format_aligned_df(df): # 计算每列的最大显示宽度(含列名) col_widths = [] for col in df.columns: # 列名宽度加2作为 padding current_max = wcswidth(str(col)) + 2 # 遍历列内所有值,更新最大宽度 for val in df[col]: val_width = wcswidth(str(val)) + 2 if val_width > current_max: current_max = val_width col_widths.append(current_max) # 输出表头 header = "".join(f"{str(col):<{width}}" for col, width in zip(df.columns, col_widths)) print(header) print("-" * sum(col_widths)) # 输出每行内容 for _, row in df.iterrows(): row_content = "".join(f"{str(val):<{width}}" for val, width in zip(row, col_widths)) print(row_content) # 使用示例 format_aligned_df(df)
方案2:使用tabulate库替代原生输出
tabulate库内置了多语言字符宽度识别逻辑,能自动处理非CJK字符的对齐问题:
- 安装依赖:
pip install tabulate
- 输出对齐的DataFrame:
from tabulate import tabulate print(tabulate(df, headers='keys', tablefmt='simple'))
方案3:更换终端等宽字体(仅终端环境)
部分终端字体对非CJK Unicode字符的宽度渲染不一致,更换为支持宽字符的等宽字体(如Noto Sans Mono、JetBrains Mono)可改善对齐效果,这属于环境配置方案。
内容的提问来源于stack exchange,提问作者Aeronautix
相关产品推荐
相关产品推荐

