如何关联两个DataFrame并生成多国家软件发布排序序列
原始输入DataFrame
| SW Source | SW Version | 国家 | Verification Code |
|---|---|---|---|
| a567dfga | b869df0a | China | XYZ-1010 |
| b869df0a | j678900a | Brazil | XYZ-1011 |
| j678900a | yur686fh | Portugal | XYZ-1012 |
待解决问题
- 如何识别版本关联并完成排序?
- 在无部署日期的情况下,结合发布国家维度跟踪软件版本的发布顺序?
已知规则
- 首个版本的
SW Version不会出现在任何条目的SW Source字段中 - 最后一个版本的
SW Source不会出现在任何条目的SW Version字段中(无后续发布版本) - 必须保留国家维度,不能丢弃
期望输出结果
| SW Source | SW Version | 国家 | Verification Code | 排序编号(Order Nr) |
|---|---|---|---|---|
| a567dfga | b869df0a | China | XYZ-1010 | 1 |
| a567dfga | b869df0a | Brazil | XYZ-1011 | 1 |
| a567dfga | b869df0a | Portugal | XYZ-1012 | 1 |
| b869df0a | j678900a | China | XYZ-1010 | 2 |
| b869df0a | j678900a | Brazil | XYZ-1011 | 2 |
| b869df0a | j678900a | Portugal | XYZ-1012 | 2 |
| j678900a | yur686fh | China | XYZ-1010 | 3 |
| j678900a | yur686fh | Brazil | XYZ-1011 | 3 |
| j678900a | yur686fh | Portugal | XYZ-1012 | 3 |
解决方案
核心思路
- 构建版本依赖链:通过
SW Source与SW Version的关联关系,识别版本的先后层级,分配排序编号 - 扩展国家维度:提取所有唯一国家列表,将每个版本对与所有国家做笛卡尔积扩展,保留完整维度
- 匹配验证码:基于国家维度关联对应的验证码,确保数据准确性
Python Pandas 代码实现
import pandas as pd # 加载原始数据 raw_data = { "SW Source": ["a567dfga", "b869df0a", "j678900a"], "SW Version": ["b869df0a", "j678900a", "yur686fh"], "国家": ["China", "Brazil", "Portugal"], "Verification Code": ["XYZ-1010", "XYZ-1011", "XYZ-1012"] } df_raw = pd.DataFrame(raw_data) # 1. 提取国家与验证码的唯一映射 country_code_mapping = df_raw[["国家", "Verification Code"]].drop_duplicates() # 2. 构建版本依赖链,生成排序编号 version_links = df_raw[["SW Source", "SW Version"]].drop_duplicates() # 找到起始版本:SW Version未出现在SW Source中的条目对应的Source start_sources = version_links[~version_links["SW Version"].isin(version_links["SW Source"])]["SW Source"].tolist() version_order_list = [] current_level = 1 current_source_list = start_sources # 迭代遍历版本层级 while current_source_list: current_pairs = version_links[version_links["SW Source"].isin(current_source_list)] # 为当前层级的版本对分配排序编号 for _, row in current_pairs.iterrows(): version_order_list.append({ "SW Source": row["SW Source"], "SW Version": row["SW Version"], "排序编号(Order Nr)": current_level }) # 更新下一层级的源版本 current_source_list = current_pairs["SW Version"].tolist() current_level += 1 order_df = pd.DataFrame(version_order_list) # 3. 笛卡尔积扩展国家维度,并关联验证码 result_df = order_df.merge(country_code_mapping, how="cross") # 调整列顺序匹配期望输出 result_df = result_df[["SW Source", "SW Version", "国家", "Verification Code", "排序编号(Order Nr)"]] print(result_df)
代码说明
- 先提取国家与验证码的唯一映射,避免重复数据
- 通过迭代方式遍历版本依赖关系,自动识别版本层级并分配排序编号
- 使用
merge(how="cross")实现版本对与国家的全量扩展,确保所有国家维度都被保留 - 最后调整列顺序,得到符合要求的输出结果
内容的提问来源于stack exchange,提问作者Someones63
相关产品推荐
相关产品推荐

