如何基于多条件合并两个不同行数的Pandas数据集?
Pandas多条件合并行数不同的数据集
需求说明
用Python Pandas合并两个行数差异较大的数据集:
- 数据集A(约30万条):列包括
Path、Line、Severity、Vulnerability、Name、Text、Title - 数据集B(约1000条):列包括
Class、Path、DTWC、DR、DW、IDFP
合并规则:
- A的
Name字段等于B的Path字段 - B的
Class字段匹配A的Path对应的类名
符合条件的行将合并为新数据集C
实现步骤及代码
1. 读取并预处理数据集
读取两个数据集,处理分隔符和字段前后的空格:
import pandas as pd # 读取数据集A,指定分隔符为|,自定义列名 df_a = pd.read_csv('dataset_a.txt', sep='\|', engine='python', header=None, names=['Path', 'Line', 'Severity', 'Vulnerability', 'Name', 'Text', 'Title']) # 去除字符串类型列的前后空格 df_a = df_a.apply(lambda col: col.str.strip() if col.dtype == 'object' else col) # 读取数据集B,同样处理分隔符和空格 df_b = pd.read_csv('dataset_b.txt', sep='\|', engine='python', header=None, names=['Class', 'Path', 'DTWC', 'DR', 'DW', 'IDFP']) df_b = df_b.apply(lambda col: col.str.strip() if col.dtype == 'object' else col)
2. 从A的Path中提取对应类名
根据示例中src.bla.bla.class.java对应com.bla.class的规则,从A的Path字段提取匹配B的Class的字段:
# 拆分Path字符串,转换为类名格式(需根据实际路径规则调整) df_a['Extracted_Class'] = df_a['Path'].str.split('.').apply(lambda parts: '.'.join(['com'] + parts[1:-2] + [parts[-2]]) ) # 示例逻辑: # 输入Path: src.bla.bla.class.java → 拆分后列表: ['src','bla','bla','class','java'] # 转换后拼接为: com.bla.class
3. 多条件合并数据集
先通过Name和Path关联两个数据集,再筛选出Class匹配的行:
# 按A.Name == B.Path进行内连接 merged_df = pd.merge(df_a, df_b, left_on='Name', right_on='Path', how='inner') # 筛选出B的Class存在于A提取的类名中的行 df_c = merged_df[merged_df['Class'].isin(merged_df['Extracted_Class'])] # 将结果保存为|分隔的文本文件(与示例格式一致) df_c.to_csv('dataset_c.txt', sep='|', index=False, header=False)
注意事项
- 类名提取逻辑需根据实际路径格式调整,上述代码仅适配示例中的路径规则
- 若需保留A的所有行(含未匹配到B的行),可将
how='inner'改为how='left'
内容的提问来源于stack exchange,提问作者Giammaria Giordano
相关产品推荐
相关产品推荐

