我有一个看起来像这样的数据框
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
关于python - 如何按同时包含数字和字符串的列对 Pandas 数据框进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47913881/