我有一个软件版本列表作为版本。该软件遵循语义版本规范,这意味着有一个主要版本,次要版本和补丁版本:
pandas有没有办法对这些版本进行排序,使0.2大于0.1但小于0.10?
答案 0 :(得分:5)
您可以使用标准distutils
!
from distutils.version import StrictVersion
versions = ['0.1', '0.10', '0.2.1', '0.2', '0.10.1']
versions.sort(key=StrictVersion)
现在它的排序如下:['0.1', '0.2', '0.2.1', '0.10', '0.10.1']
答案 1 :(得分:4)
Pandas解决方案sorted
,StrictVersion solution并分配给列:
print (df)
ver
0 0.1
1 0.2
2 0.10
3 0.2.1
4 0.3
5 0.10.1
from distutils.version import StrictVersion
df['ver'] = sorted(df['ver'], key=StrictVersion)
print (df)
ver
0 0.1
1 0.2
2 0.2.1
3 0.3
4 0.10
5 0.10.1
编辑:
对于排序索引,可以使用reindex
:
print (df)
a b
ver
0.1 1 q
0.2 2 w
0.10 3 e
0.2.1 4 r
0.3 5 t
0.10.1 6 y
from distutils.version import StrictVersion
df = df.reindex(index=pd.Index(sorted(df.index, key=StrictVersion)))
print (df)
a b
0.1 1 q
0.2 2 w
0.2.1 4 r
0.3 5 t
0.10 3 e
0.10.1 6 y
答案 2 :(得分:0)
如果您的值是唯一的,那些工作正常,但这是我找到的可能有重复的语义值列的最佳解决方案。
/(jan|feb|mar)[a-z]*[0-9]/i
答案 3 :(得分:0)
我也经常遇到这个问题(在搜索很多之后(我发现的第一页就是这个问题:D)),我想我的解决方案值得一提。
因此,目前在熊猫中有两个排序函数sort_values
和sort_index
,它们都没有一个key
参数供我们传递自定义排序函数给它。参见this github问题。
jezrael's answer很有帮助,我将以此为基础构建解决方案。
df['ver'] = sorted(df['ver'], key=StrictVersion)
仅在verion列是DataFrame中的单个列时才有用,否则我们需要在version列之后对其他列进行排序。
jezrael reindex
DataFrame,因为所需的索引顺序可以通过确实具有sorted
参数的buitin key
函数获得。
但是,如果版本不是索引并且我不想set_index('ver')
,该怎么办?
我们可以使用apply
将原始版本字符串映射到StrictVersion
对象,然后sort_values
将按照想要的顺序排序:
from distutils.version import StrictVersion
df['ver'] = df['ver'].apply(StrictVersion)
df.sort_values(by='ver')