【发布时间】:2019-12-18 02:26:03
【问题描述】:
我在工作中遇到了一个与排序有关的问题。我目前正在使用 Pandas 来保存我们的数据,我需要对包含带有数字和分隔符的字符串的列进行排序。
我已经尝试在要排序的列上使用 vanilla df.sort_values('Field Name'),但是出现了一些不需要的结果。
Python 格式的样本数据:
import pandas as pd
lis=[]
for i in ['99','100','101','102']:
for j in map(str,[1,2,3,4,5,6,7,8,10,20,22,21,34]):
for k in map(str,[1,2,11,12,22,23,33,16,17]):
lis.append(i+'_'+j+'-'+k)
y = pd.DataFrame(dict(Field=lis))
y.sort_values('Field')
示例输出:
Field
0 100_1-1
1 100_1-11
2 100_1-12
3 100_1-16
4 100_1-17
5 100_1-2
6 100_1-22
7 100_1-23
8 100_1-33
9 100_10-1
10 100_10-11
11 100_10-12
12 100_10-16
13 100_10-17
14 100_10-2
15 100_10-22
16 100_10-23
17 100_10-33
18 100_2-1
19 100_2-11
20 100_2-12
21 100_2-16
22 100_2-17
....
从这里可以看出,列表应该以“99”字符串开头。此外,您在 100_1-2 之前有 100_1-11、100_1-12、100_1-13。
我可以用下面的方法解决第一个问题,理论上如果我知道分隔符和分隔符的数量,那么我可以迭代地继续这样做,直到得到我想要的结果。
y.reindex(y['Field'].str.split('_',1,expand=True)[0].astype(int).sort_values(0).index).reset_index(drop=True)
但由于可能会使用分隔符“_”和“-”,所以它们不一定会在我收到的数据中使用,我也不知道只有 2 个分隔符。所以理论上我会得到如下糟糕的结果:
100_1_22-12-34:5
我仍然需要能够按预期对它们进行排序。
但是,有没有办法使用 Pandas 以更一般的形式获得我想要的结果?明确地说,我希望所有数字都按预期排列,代码尽可能少。
【问题讨论】:
-
不错的第一篇文章,感谢您提供良好的minimal reproducible example 和问题描述以及演示数据/想要的输出
标签: python string pandas sorting