如何将DataFrame索引的字母数字字符串拆分为两列?
问题
我有一个以如下内容为索引的DataFrame:
Index(['LCOc1', 'LCOc2', 'LCOc3', 'LCOc4', 'LCOc5', 'LCOc6', 'LCOc7', 'LCOc8', 'LCOc9', 'LCOc10', 'LCOc11', 'LCOc12', 'CLc1', 'CLc2', 'CLc3', 'CLc4', 'CLc5', 'CLc6', 'CLc7', 'CLc8', 'CLc9', 'CLc10', 'CLc11', 'CLc12', 'OQc1', 'OQc2', 'OQc3', 'OQc4', 'OQc5', 'OQc6', 'OQc7', 'OQc8', 'OQc9', 'OQc10', 'OQc11', 'OQc12'], dtype='object', name='CLOSE')
希望新增两列:一列仅包含字母部分(如['LCOc', 'LCOc', ..., 'CLc', ...]),另一列仅包含数字部分(如[1,2,...,12,1,...])。尝试过str.split和str.extract但未成功实现目标。以下是DataFrame的部分数据:
2022-09-02 CLOSE LCOc1 93.02 LCOc2 91.81 LCOc3 90.66 LCOc4 89.52 LCOc5 88.52 LCOc6 87.68 LCOc7 86.94 LCOc8 86.24 LCOc9 85.63 LCOc10 85.02 LCOc11 84.40 LCOc12 83.81 CLc1 86.87 CLc2 86.48 CLc3 85.90 CLc4 85.19 CLc5 84.41
解决方案
你之前用str.extract没成功,大概率是正则表达式没匹配对格式。你的索引是「固定字母前缀+1-2位数字」的结构,用下面的方法就能准确拆分:
方法1:用str.extract精准拆分
直接对索引使用正则提取,把字母和数字分成两组:
# 提取字母和数字列,正则匹配开头非数字+结尾数字 df[['字母前缀', '月份']] = df.index.str.extract(r'^([^\d]+)(\d+)$') # 把数字列转成整数(可选,根据需求来) df['月份'] = df['月份'].astype(int)
运行后DataFrame就会新增两列,效果如下:
2022-09-02 字母前缀 月份 CLOSE LCOc1 93.02 LCOc 1 LCOc2 91.81 LCOc 2 ... LCOc12 83.81 LCOc 12 CLc1 86.87 CLc 1 ...
方法2:替换法拆分(更直观)
如果觉得正则提取有点绕,也可以用替换的方式分别保留字母和数字:
# 去掉结尾的数字,保留字母部分 df['字母前缀'] = df.index.str.replace(r'\d+$', '') # 去掉开头的字母,保留数字部分并转成整数 df['月份'] = df.index.str.replace(r'^\D+', '').astype(int)
这个方法和extract效果完全一致,只是实现方式不同,选哪个看你习惯。
内容的提问来源于stack exchange,提问作者neutralname
相关产品推荐
相关产品推荐

