Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何对熊猫中的语义版本进行排序?_Python_Pandas - Fatal编程技术网

Python 如何对熊猫中的语义版本进行排序?

Python 如何对熊猫中的语义版本进行排序?,python,pandas,Python,Pandas,我有一个软件版本列表。软件遵循语义版本规范,即有主版本、次版本和补丁版本: 0.1 0.2 0.2.1 0.3 0.10 0.10.1 pandas中是否有办法对这些版本进行排序,使0.2大于0.1但小于0.10?您可以使用标准的distutils进行排序 from distutils.version import StrictVersion versions = ['0.1', '0.10', '0.2.1', '0.2', '0.10.1'] versions.sort(key=Str

我有一个软件版本列表。软件遵循语义版本规范,即有主版本、次版本和补丁版本:

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

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

您可以使用标准的
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']


排序的解决方案分配给列:

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
编辑:

对于排序索引,可以使用:


如果您的值是唯一的,那么这些方法可以很好地工作,但是这里是我为可能存在重复的语义值列找到的最佳解决方案

import pandas as pd
from distutils.version import StrictVersion    

unique_sorted_versions = sorted(set(df['Version']), key=StrictVersion)

groups = [df[df['Version'].isin([version])]
          for version in unique_sorted_versions]

new_df = pd.concat(groups)

我也遇到了这个问题,在谷歌搜索了很多次之后(我发现的第一个页面是这样的问题:D),我想我的解决方案值得一提

因此,目前pandas中有两个排序函数,
sort\u values
sort\u index
,它们都没有一个
参数供我们向其传递自定义排序函数。参见github问题

非常有帮助,我将在此基础上构建我的解决方案

df['ver']=sorted(df['ver'],key=StrictVersion)
仅当verion列是数据帧中的单个列时才有用,否则我们需要对version列后面的其他列进行排序

jezrael
reindex
数据帧,因为需要的索引顺序可以通过内置
sorted
函数获得,该函数具有
参数

但是,如果版本不是索引,我不想设置索引('ver')

我们可以使用
apply
将原始版本字符串映射到
StrictVersion
对象,然后
sort\u值
将按所需顺序排序:

from distutils.version import StrictVersion
df['ver'] = df['ver'].apply(StrictVersion)
df.sort_values(by='ver')

我重新打开这个问题是因为OP需要一个解决方案。所以,我发现我仍然有一个问题:如果有其他列,这也不会改变其他列中的字段-有没有办法完成类似于使用key=StrictVersion的sort_index的操作?给我一些时间。超级,很高兴能帮上忙!
from distutils.version import StrictVersion
df['ver'] = df['ver'].apply(StrictVersion)
df.sort_values(by='ver')