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列后面的其他列进行排序
jezraelreindex
数据帧,因为需要的索引顺序可以通过内置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')