pandas 按提交日期排序的标签版本升级

3ks5zfa0  于 2023-02-20  发布在  其他
关注(0)|答案(1)|浏览(82)

我有两列 Dataframe ,如下所示:
| 标号|信息版本|
| - ------|- ------|
| | 十八、二、六|
| | 十八、二、六|
| | 十八、二、七|
| | 十八、二、八|
| | 十八、二、八|
| | 二十、一、一|
| | 二十、二、一|
我想把每个版本增量都标记为升级版本,比如每个id的第一个条目保持为none,然后开始标记,如果没有变化,那么条目为none,所以输出应该是这样的:
| 标号|信息版本|
| - ------|- ------|
| 无|十八、二、六|
| 无|十八、二、六|
| 补片|十八、二、七|
| 补片|十八、二、八|
| 无|十八、二、八|
| 大调|二十、一、一|
| 小调|二十、二、一|

import pandas as pd
from packaging import version

def version_upgrade(prev_version, current_version):
    if prev_version is None:
        return None
    elif version.parse(current_version) > version.parse(prev_version):
        if version.parse(current_version).major > version.parse(prev_version).major:
            return "major"
        elif version.parse(current_version).minor > version.parse(prev_version).minor:
            return "minor"
        else:
            return "patch"
    else:
        return None

semver_df["label"] = None

prev_version_list = semver_df["info_version"].shift(1).tolist()
semver_df["label"] = semver_df["info_version"].apply(lambda x: version_upgrade(prev_version_list.pop(0), x))

这段代码在我提供样本数据时可以工作,但是在我的情况下,我也需要对我的提交日期进行排序,我不确定这将如何实现。任何帮助都将不胜感激!

iezvtpos

iezvtpos1#

这里有一种方法。拆分和扩展版本号,然后将dtype更改为int,并按主版本、次版本和补丁版本对值进行排序。计算diff以比较前一行和当前行,然后使用np.select根据版本组件的差异从主版本、次版本和补丁版本中进行选择

cols = ['major', 'minor', 'patch']
df[cols] = df['info_version'].str.split('.', expand=True).astype(int)
df = df.sort_values(cols)

v = df[cols].diff()
df['label'] = np.select(
    [v['major'] > 0, v['minor'] > 0, v['patch'] > 0],
    cols, default=None
)

df = df.drop(cols, axis=1)
结果
info_version  label
0       18.2.6   None
1       18.2.6   None
2       18.2.7  patch
3       18.2.8  patch
4       18.2.8   None
5       20.1.1  major
6       20.2.1  minor

相关问题