如何在Pandas DataFrame中正确处理日文字符的补位填充?
解决Pandas中日文全角/半角混合字符串的等宽补位问题
问题核心在于:Python默认按Unicode代码点计数字符,但日文字符(全角汉字、假名等)在显示时占2个宽度,半角字母/数字占1个宽度。直接用str.pad会把所有字符按1个宽度计算,导致补位结果不符合预期。
解决方案步骤
- 先计算字符串的实际显示宽度
- 根据目标宽度(15)计算需要补充的半角0数量
- 拼接原字符串与补位的0
完整代码实现
from io import StringIO import pandas as pd import unicodedata # 定义计算字符串显示宽度的函数 def get_display_width(s): total_width = 0 for char in s: # 通过Unicode属性判断字符宽度:全角/宽字符占2,半角占1 if unicodedata.east_asian_width(char) in ('W', 'F', 'A'): total_width += 2 else: total_width += 1 return total_width # 加载原始数据 StringData = StringIO( """agency_code,Name 亜草 太郎32,パンダーサン 亜草 太郎3223,2 """ ) df_orig_data = pd.read_csv(StringData, sep=",") # 执行补位操作 df_orig_data['padded_agency_code'] = df_orig_data['agency_code'].apply( lambda s: s + '0' * (15 - get_display_width(s)) ) # 输出结果 print(df_orig_data['padded_agency_code'])
输出结果
0 亜草 太郎320000 1 亜草 太郎322300 Name: padded_agency_code, dtype: object
关键说明
unicodedata.east_asian_width():用于判断字符的东亚宽度属性,其中W/F/A对应占2宽度的全角/宽字符,其他值对应占1宽度的半角字符- 补位用的半角0每个占1宽度,因此直接用
15 - 当前显示宽度即可得到需要补充的0的数量
内容的提问来源于stack exchange,提问作者Curious_Insider
相关产品推荐
相关产品推荐

