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

标签 python pandas sorting dataframe

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

         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

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

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

关于python - 如何按同时包含数字和字符串的列对 Pandas 数据框进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47913881/

相关文章:

Python 守护进程 : checking to have one daemon run at all times

python - Pandas:使用多索引数据进行透视

mysql - 将字典键映射到 Mysql 数据库表列

mysql - Opensearchserver 按字段排序

c# - 如何正确排序 DataTable 的字符串数字列

c++ - 按多列对二维 vector 进行排序

Python Scrapy 无法从类中提取文本

python - 将张量向量附加到张量矩阵

python - django 新手 - 一周中的每一天改变模板表样式

Python (Pandas) : When to use replace vs. 映射与转换?