如何在DataFrame中按指定规则转换列并生成排序后的新列?
Pandas字符串列格式转换与自定义排序实现
需求说明
有一个Pandas DataFrame的字符串列,满足以下规则:
- 所有字符串以字母开头,可以字母结尾
- 用英文句点
.分隔各段内容 - 分隔后的数字段长度为1位或2位
需要完成两项操作:
- 生成新列:将
.替换为_,数字段补零至2位,字母段转为大写 - 按「先字母、再数字」的层级规则对DataFrame排序,得到指定格式结果
输入示例
Col H.14.01.2 H.14.01.11 H.14.2 H.14.01.12 H.14.01.20 H.14.02.02 H.14.02.J H.14.01.1 H.14.01.A H.14.01.11.1 H.14.01.12.b
期望输出
Required H_14_01_01 H_14_01_02 H_14_01_11 H_14_01_11_01 H_14_01_12 H_14_01_12_B H_14_01_20 H_14_01_A H_14_02 H_14_02_02 H_14_02_J
实现代码
1. 导入库并构造示例数据
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'Col': [ 'H.14.01.2', 'H.14.01.11', 'H.14.2', 'H.14.01.12', 'H.14.01.20', 'H.14.02.02', 'H.14.02.J', 'H.14.01.1', 'H.14.01.A', 'H.14.01.11.1', 'H.14.01.12.b' ] })
2. 定义格式转换函数并生成新列
def format_column(s): # 按句点拆分字符串 parts = s.split('.') processed_parts = [] for part in parts: if part.isdigit(): # 数字补零到2位 processed_parts.append(part.zfill(2)) else: # 字母转大写 processed_parts.append(part.upper()) # 用下划线拼接 return '_'.join(processed_parts) # 生成新列Required df['Required'] = df['Col'].apply(format_column)
3. 自定义排序规则并排序
def get_sort_key(s): # 按下划线拆分排序键 key_parts = [] for part in s.split('_'): if part.isdigit(): # 数字转为整数,确保按数值排序 key_parts.append(int(part)) else: # 字母保持字符串,按字母顺序排序 key_parts.append(part) return key_parts # 按自定义key排序,重置索引 df_sorted = df.sort_values(by='Required', key=lambda x: x.apply(get_sort_key)).reset_index(drop=True)
4. 查看结果
# 打印最终结果的Required列 print(df_sorted['Required'])
运行后即可得到符合要求的排序结果。
内容的提问来源于stack exchange,提问作者Manojs
相关产品推荐
相关产品推荐

