Skip to main content
 首页 » 编程设计

python之如何按同时包含数字和字符串的列对 Pandas 数据框进行排序

2025年05月04日22bonelee

我有一个看起来像这样的数据框

         col0         col1  col2   col4 
         1    '1ZE7999'  865545   20    20 
         2    'R022428'  865584  297     0 
         3    34         865665  296     0  
         4    56         865700  297     0 
         5    100        865628  292     5 

我想按'col0'排序,首先是数值,然后是字符串,Excel排序的方式

       col0         col1  col2   col4 
  3    34         865665  296     0  
  4    56         865700  297     0 
  5    100        865628  292     5 
  1    '1ZE7999'  865545   20    20 
  2    'R022428'  865584  297     0 

我用过

df.sort_values(by='col1', ascending=True) 

但这并没有那样排序,它是从 0-9 然后是 a-z 排序

      col0         col1  col2   col4 
 1    '1ZE7999'  865545   20    20 
 5    100        865628  292     5 
 3    34         865665  296     0  
 4    56         865700  297     0 
 2    'R022428'  865584  297     0 

请您参考如下方法:

pd.to_numeric + sort_values + loc -

df.loc[pd.to_numeric(df.col0, errors='coerce').sort_values().index] 
 
        col0    col1  col2  col4 
3         34  865665   296     0 
4         56  865700   297     0 
5        100  865628   292     5 
1  '1ZE7999'  865545    20    20 
2  'R022428'  865584   297     0 

详情

pd.to_numeric 将非整数值强制转换为 NaN -

i = pd.to_numeric(df.col0, errors='coerce') 
i 
 
1      NaN 
2      NaN 
3     34.0 
4     56.0 
5    100.0 
Name: col0, dtype: float64 

sort_values 对列进行排序,忽略 NaN。

j = i.sort_values() 
j 
 
3     34.0 
4     56.0 
5    100.0 
1      NaN 
2      NaN 
Name: col0, dtype: float64 

观察指数。您需要做的就是使用索引重新索引数据框。 loc 或 reindex 都可以。

df.loc[j.index] 
 
        col0    col1  col2  col4 
3         34  865665   296     0 
4         56  865700   297     0 
5        100  865628   292     5 
1  '1ZE7999'  865545    20    20 
2  'R022428'  865584   297     0 
df.reindex(index=j.index) 
 
        col0    col1  col2  col4 
3         34  865665   296     0 
4         56  865700   297     0 
5        100  865628   292     5 
1  '1ZE7999'  865545    20    20 
2  'R022428'  865584   297     0 

如果您需要重置索引,这很容易完成。

df.loc[j.index].reset_index(drop=True) 
 
        col0    col1  col2  col4 
0         34  865665   296     0 
1         56  865700   297     0 
2        100  865628   292     5 
3  '1ZE7999'  865545    20    20 
4  'R022428'  865584   297     0