我如何在熊猫中对语义版本进行排序?

时间:2017-06-21 19:57:03

标签: python pandas

我有一个软件版本列表作为版本。该软件遵循语义版本规范,这意味着有一个主要版本,次要版本和补丁版本:

  • 0.1
  • 0.2
  • 0.2.1
  • 0.3
  • ...
  • 0.10
  • 0.10.1

pandas有没有办法对这些版本进行排序,使0.2大于0.1但小于0.10?

4 个答案:

答案 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']

Source

答案 1 :(得分:4)

Pandas解决方案sortedStrictVersion 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_valuessort_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')