Python实现按VIN列识别C≤10条件的新软件问题求助
识别Pandas DataFrame中同一VIN下的新软件版本
解决方案思路
核心逻辑是:按VIN分组后,提取软件版本后缀判断更新顺序,再结合C列≤10的条件标记新软件。以下是两种高效实现方式,避免apply可能的性能问题。
实现代码(简洁版)
先假设你的输入DataFrame结构如下:
import pandas as pd # 示例输入数据 data = { 'VIN': ['VIN1', 'VIN1', 'VIN1', 'VIN2', 'VIN2'], 'SOFTWARE': ['c5D2-14N450-CBQ', 'c5D2-14N450-CBR', 'c5D2-14N450-CBS', 'X1Y2-98Z76-AA', 'X1Y2-98Z76-AB'], 'C': [5, 8, 12, 9, 15] } df = pd.DataFrame(data)
执行以下代码完成标记:
# 1. 提取软件版本后缀(最后一段字符) df['VERSION'] = df['SOFTWARE'].str.split('-').str[-1] # 2. 按VIN分组,给每个版本排序排名(升序:1=最早版本,数值越大版本越新) df['VERSION_RANK'] = df.groupby('VIN')['VERSION'].rank(method='dense', ascending=True) # 3. 标记新软件:版本排名>1(更新版本)且C列≤10 df['IS_NEW_SOFTWARE'] = (df['VERSION_RANK'] > 1) & (df['C'] <= 10) # 清理中间列(可选) df = df.drop(['VERSION', 'VERSION_RANK'], axis=1)
期望输出
运行后得到的结果:
VIN SOFTWARE C IS_NEW_SOFTWARE 0 VIN1 c5D2-14N450-CBQ 5 False 1 VIN1 c5D2-14N450-CBR 8 True 2 VIN1 c5D2-14N450-CBS 12 False 3 VIN2 X1Y2-98Z76-AA 9 False 4 VIN2 X1Y2-98Z76-AB 15 False
代码解释
- 提取版本后缀:通过
str.split('-').str[-1]拆分软件字符串,取最后一段作为版本标识(比如CBQ、CBR)。 - 版本排名:用
groupby+rank给每个VIN下的版本排序,method='dense'确保相同版本不会跳号,ascending=True让最早版本排名为1。 - 条件判断:只有同时满足「版本是更新后的(排名>1)」和「C列≤10」的行,才标记为新软件。
备选方案(使用apply)
如果偏好apply方式,也可以用分组自定义函数实现:
def mark_new_software(group): # 按版本排序,确定更新顺序 group_sorted = group.sort_values('SOFTWARE').copy() # 标记除第一个版本外的更新版本 group_sorted['IS_NEW_SOFTWARE'] = group_sorted.index != group_sorted.index[0] # 过滤C列>10的情况 group_sorted.loc[group_sorted['C'] > 10, 'IS_NEW_SOFTWARE'] = False return group_sorted # 分组应用函数并重置索引 df = df.groupby('VIN').apply(mark_new_software).reset_index(drop=True)
注意:apply在大数据量下性能不如rank+transform的方式,优先推荐第一种方案。
内容的提问来源于stack exchange,提问作者junaid
相关产品推荐
相关产品推荐

