You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对齐含阿拉伯语、泰语等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库可以精准计算每个字符串的终端显示宽度,据此手动格式化输出:

  1. 安装依赖:
pip install wcwidth
  1. 自定义格式化函数:
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字符的对齐问题:

  1. 安装依赖:
pip install tabulate
  1. 输出对齐的DataFrame:
from tabulate import tabulate

print(tabulate(df, headers='keys', tablefmt='simple'))

方案3:更换终端等宽字体(仅终端环境)

部分终端字体对非CJK Unicode字符的宽度渲染不一致,更换为支持宽字符的等宽字体(如Noto Sans Mono、JetBrains Mono)可改善对齐效果,这属于环境配置方案。


内容的提问来源于stack exchange,提问作者Aeronautix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 21:24:56