基于Pandas按Desc列筛选if列并保留关联列数据的技术问询
Pandas筛选关联数据并优化合并流程
场景说明
现有两个CSV文件,通过pd.concat(axis=1)合并得到TestMerge.csv,需实现:
- 筛选出
if(C)列值存在于Desc(A)列的行; - 保留
Desc(A)与ONT(B)、if(C)与Status(D)的关联关系; - 确认是否可在合并前完成筛选。
原始合并代码及数据集结构如下:
import pandas as pd df_1 = pd.read_csv('TEST_ifDescr.csv') df_2 = pd.read_csv('WG_ifOperStatus.csv') frames = [df_1, df_2] df = pd.concat(frames, sort=False, axis=1) df.to_csv('TestMerge.csv', index=False)
TestMerge.csv Desc(A) ONT(B) if(C) Status(D) 16292413441 ADTN210784db 25300071 down 16292423681 ADTN21078135 25300072 down 16292433921 ADTN210780ef 25300200 up 16292444161 ADTN2039e094 25300201 up 16292454401 ADTN201242db 1627653120 up 16292464641 ADTN2019306c 1627653185 up
期望输出:
Desc(A) ONT(B) if(C) Status(D) 16292413441 ADTN210784db 16292413441 down 16292423681 ADTN21078135 16292423681 down 16292433921 ADTN210780ef 16292433921 up 16292444161 ADTN2039e094 16292444161 up 16292454401 ADTN201242db 16292454401 up
可行实现方案
方案一:合并时直接关联筛选(推荐)
原concat(axis=1)依赖行索引对齐,极易出现关联错误。改用pd.merge按匹配键内连接,自动筛选出Desc(A)与if(C)值相等的行,同时保证关联关系准确:
import pandas as pd # 读取原始文件 df_1 = pd.read_csv('TEST_ifDescr.csv') df_2 = pd.read_csv('WG_ifOperStatus.csv') # 统一匹配列类型为字符串,避免类型不匹配导致的筛选失败 df_1['Desc(A)'] = df_1['Desc(A)'].astype(str) df_2['if(C)'] = df_2['if(C)'].astype(str) # 内连接:仅保留两列值匹配的行 merged_df = pd.merge(df_1, df_2, left_on='Desc(A)', right_on='if(C)', how='inner') # 调整列顺序为期望格式 result_df = merged_df[['Desc(A)', 'ONT(B)', 'if(C)', 'Status(D)']] # 输出并保存结果 print(result_df) result_df.to_csv('Filtered_TestMerge.csv', index=False)
方案二:合并后筛选(适用于已有合并文件的场景)
如果已生成TestMerge.csv,可直接读取后筛选:
import pandas as pd df = pd.read_csv('TestMerge.csv') # 统一类型 df['Desc(A)'] = df['Desc(A)'].astype(str) df['if(C)'] = df['if(C)'].astype(str) # 筛选if(C)值存在于Desc(A)集合中的行 filtered_df = df[df['if(C)'].isin(df['Desc(A)'])] # 输出或保存 print(filtered_df) filtered_df.to_csv('Filtered_TestMerge.csv', index=False)
方案三:合并前完成筛选(完全可行)
提前筛选能减少后续计算的数据量,提升效率,步骤如下:
import pandas as pd df_1 = pd.read_csv('TEST_ifDescr.csv') df_2 = pd.read_csv('WG_ifOperStatus.csv') # 统一类型 df_1['Desc(A)'] = df_1['Desc(A)'].astype(str) df_2['if(C)'] = df_2['if(C)'].astype(str) # 提取Desc(A)的唯一值集合 desc_values = set(df_1['Desc(A)']) # 提前筛选df_2中符合条件的行 filtered_df_2 = df_2[df_2['if(C)'].isin(desc_values)] # 合并筛选后的df_2与df_1 merged_df = pd.merge(df_1, filtered_df_2, left_on='Desc(A)', right_on='if(C)', how='inner') result_df = merged_df[['Desc(A)', 'ONT(B)', 'if(C)', 'Status(D)']] print(result_df)
关键建议
- 优先用merge替代concat:
concat(axis=1)依赖行索引,无法保证数据关联的准确性,merge通过指定关联键能避免此类问题。 - 统一匹配列类型:必须将
Desc(A)和if(C)转为相同类型(如字符串),否则会因数值/字符串类型差异导致匹配失败。 - 大数据量优先提前筛选:若原始数据规模较大,合并前先筛选目标行,能显著降低内存占用和计算耗时。
内容的提问来源于stack exchange,提问作者Nuclear7740
相关产品推荐
相关产品推荐

