Pandas DataFrame按整数、数字字符串混合、纯字符串排序求助
Pandas DataFrame按指定规则排序问题
需求说明
需要对DataFrame的name列按以下规则排序:
- 纯整数(含字符串形式纯数字)排在最前
- 数字与字符串混合类型次之
- 纯字符串类型排在最后
原始数据
import pandas as pd df = pd.DataFrame({'name': ['aaa', 'ccc', 'bbb', '1c2z45zz', 55, 3, 'et45']})
期望输出
df = pd.DataFrame({'name': [3, 55, '1c2z45zz', 'et45', 'aaa', 'bbb', 'ccc']})
已尝试方法(均未得到预期结果)
- 使用natsort库:
import natsort df.iloc[natsort.index_humansorted(df.name)]
- 字符串填充排序:
max_length = max(df.name.str.len()) df['sort_name']=df.name.str.pad(max_length,'right','~') df.sort_values('sort_name', inplace=True, ignore_index=True)
- 自定义key排序:
df_sorted = df.astype(str).sort_values(by='name',key=lambda x: (x.isdigit(), x))
解决方案
核心是通过自定义排序key,给不同类型元素分配优先级,再按优先级+内容排序:
import pandas as pd df = pd.DataFrame({'name': ['aaa', 'ccc', 'bbb', '1c2z45zz', 55, 3, 'et45']}) def sort_key(x): # 处理纯整数或字符串形式纯数字,优先级0,按数值排序 if isinstance(x, int): return (0, x) str_x = str(x) if str_x.isdigit(): return (0, int(str_x)) # 处理数字+字符串混合类型,优先级1,按字符串自然排序 if any(c.isdigit() for c in str_x): return (1, str_x) # 处理纯字符串,优先级2,按字符串自然排序 return (2, str_x) # 应用自定义key排序 df_sorted = df.sort_values(by='name', key=lambda col: col.apply(sort_key), ignore_index=True) print(df_sorted)
执行后输出:
name 0 3 1 55 2 1c2z45zz 3 et45 4 aaa 5 bbb 6 ccc
代码说明
- 优先级规则:纯数字类(int/字符串纯数字)> 混合类型 > 纯字符串
- 同一优先级内:数字按数值大小排序,字符串按自然顺序排序
- 利用元组排序特性,先比较优先级(元组第一个元素),再比较内容(元组第二个元素)
内容的提问来源于stack exchange,提问作者user21510116
相关产品推荐
相关产品推荐

